之前我们通过O2IOTServer类已经实现了设备的初始化配置,现在我们需要使用配置信息,连接到可以用的WiFi,并连接登录到O2OA服务器。
创建O2IOTClient类
在o2iot目录下创建文件:O2IOTClient.h,代码如下:
//引用ESP8266的WiFi库 //引用ESP8266的HttpClient库 //引用EEPROM库 //引用ArduinoJson库 class O2IOTClient { public: //配置信息变量 String xtoken=""; String o2host=""; String o2port=""; String o2user=""; String o2pass=""; bool begin(); //初始化client,连接WiFi,并登录O2OA bool connect(); //连接WiFi String _doGet(String url); //发起http-get请求 String _doPost(String url, String data); //发起http-post请求 String _doPut(String url, String data); //发起http-put请求 void getConfig(); //获取设备配置信息 void parseConfig(); //解析设备配置信息 private: ESP8266WiFiMulti WiFiMulti; //esp8266WiFi对象 void blink(char n); //芯片led灯闪烁 bool _getToken(); //登录到O2OA,并获取token char _ssidConfig[128]; //配置信息存储128字节 char *ssid_name; //热点名称 char *ssid_pass; //热点密码 }; extern O2IOTClient O2_IOTClient; /* O2IOTCLIENT_H_ */
然后我们需要创建.cpp来实现头文件中定义的方法,所以在o2iot目录下创建文件:O2IOTClient.cpp,代码如下:
void O2IOTClient::blink(char n){ //此方法用于让芯片的led灯闪烁n次 for (char i = 0; i < n; i++) { digitalWrite(LED_BUILTIN, LOW); delay(100); digitalWrite(LED_BUILTIN, HIGH); delay(100); } } bool O2IOTClient::begin() { //开始连接WiFi和登录 EEPROM.begin(512); //ESP8266使用EEPROM需要首先调用EEPROM.begin(size)方法 if (connect()){ //将设备连接到WiFi热点 blink(2); //如果成功连接到WiFi让设备led灯闪烁2次 if (_getToken()){ //登录到O2OA服务器,并获取toekn blink(3); //如果成功登录,并获取到token,让设备led灯闪烁3次 } } return false; } void O2IOTClient::getConfig() { //从EEPROM中获取设备配置信息 for (int i = 0; i < 128; i++) { _ssidConfig[i] = EEPROM.read(i); } } void O2IOTClient::parseConfig() { //解析设备配置信息,存储到变量 if (strchr(_ssidConfig, '|')!=NULL){ if (_ssidConfig[0] != NULL) { ssid_name = strtok(_ssidConfig, "|"); ssid_pass = strtok(NULL, "|"); o2user = strtok(NULL, "|"); o2pass = strtok(NULL, "|"); o2host = strtok(NULL, "|"); o2port = strtok(NULL, "|"); } } } bool O2IOTClient::connect() { //连接WiFi热点 getConfig(); parseConfig(); if (ssid_name[0] != NULL && ssid_pass[0] != NULL) { WiFiMulti.addAP(ssid_name, ssid_pass); //连接WiFi热点 int n = 0; while (WiFiMulti.run() != WL_CONNECTED && n<20) { //如果没有链接到,重试20次 delay(500); //每500毫秒重连一次 n++; } if (WiFiMulti.run() == WL_CONNECTED) { //已连接到WiFi,返回true return true; } return false; } return false; } bool O2IOTClient::_getToken(){ //发起Post请求进行登录O2OA if (!o2host.equalsIgnoreCase("") && !o2port.equalsIgnoreCase("")){ //获取登录token的url,此处是O2OA服务平台的一个接口,等会我们会创建这个接口服务 String url = "http://"+o2host+":"+o2port+"/x_program_center/jaxrs/invoke/getToken/execute"; //发起post请求,传输用户名和密码 String payload = _doPost(url, "{'user':'"+o2user+"', 'pass': '"+o2pass+"'}"); if (payload.equalsIgnoreCase("")) return false; //解析请求的返回结果,先创建json的document对象 StaticJsonDocument<256> doc; DeserializationError error = deserializeJson(doc, payload); //获取到data.token,保存到xToken变量 JsonObject json = doc["data"].as<JsonObject>(); xtoken = json["token"].as<String>(); doc.clear(); return true; } return false; } String O2IOTClient::_doGet(String url){ //此方法发起get请求 HTTPClient http; //创建http对象 http.begin(url); //开始http请求 //设置http头 http.addHeader("Content-Type", "application/json; charset=utf-8"); http.addHeader("Origin", "http://"+o2host); String payload=""; //发起get请求 int httpCode = http.GET(); if (httpCode > 0) { if (httpCode == HTTP_CODE_OK) { payload = http.getString(); payload.trim(); } } http.end(); return payload; } String O2IOTClient::_doPost(String url, String data) { //此方法发起post请求 HTTPClient http; http.begin(url); //HTTP http.addHeader("Content-Type", "application/json; charset=utf-8"); http.addHeader("Origin", "http://"+o2host); String payload=""; int httpCode = http.POST(data); if (httpCode > 0) { if (httpCode == HTTP_CODE_OK) { payload = http.getString(); payload.trim(); } } http.end(); return payload; } String O2IOTClient::_doPut(String url, String data) { //此方法发起post请求 HTTPClient http; http.begin(url); //HTTP http.addHeader("Content-Type", "application/json; charset=utf-8"); http.addHeader("Origin", "http://"+o2host); String payload=""; int httpCode = http.sendRequest("put", data); if (httpCode > 0) { if (httpCode == HTTP_CODE_OK) { payload = http.getString(); payload.trim(); } } http.end(); return payload; } O2IOTClient O2_IOTClient;
现在我们完成了O2IOTClient类,实现了连接WiFi和登录O2OA,并获取token,但还缺少O2OA的登录接口。
创建O2OA登录接口
接下来,我们要在O2OA服务器创建一个接口服务,以便设备登录并获取token。就是上述代码中调用的getToken服务。以服务管理员身份登录O2OA服务器,进入服务管理平台,新建一个接口,命名为“getToken”,并输入以下代码:
//将请求消息体解析为json var res = JSON.parse(this.requestText.toString()); //创建登录请求需要的消息体 var o = {"credential":res.user,"codeAnswer":res.pass}; //通过x_organization_assemble_authentication中的AuthenticationAction.codeLogin方法登录系统 this.Actions.load("x_organization_assemble_authentication").AuthenticationAction.codeLogin(o, function(json){ //获取登录的token var token = json.data.token; //将token作为响应返回给客户端 this.response.setBody({"data": {"token": token}}, "application/json"); }.bind(this));
在O2OA中创建用户
我们需要在O2OA服务器创建一个用户,用于设备登录,创建用户过程,请自行查阅文档。在此我创建了一个叫做iot的用户。
在设备主程序中调用
我们回到o2iot.ino文件,更新一下代码,调用O2IOTClient类。
//引用Arduino核心库 //引用O2IOTServer类 //引用O2IOTClient类 void setup() { pinMode(LED_BUILTIN, OUTPUT); //将LED_BUILTIN引脚配置为输出 digitalWrite(LED_BUILTIN, HIGH); O2_IOTServer.begin(); //启动AP接入点,并启动Web服务 O2_IOTClient.begin(); //连接WiFi,并登录到O2OA } void loop() { O2_IOTServer.listening(); //监听http请求 }
验证和上载程序
这个步骤和上一章中所讲的一样。
看看效果
此时,我们开发板上已经开始运行我们的程序了,按上一章所讲,设置好要连接的WiFi,O2OA中心服务器器地址,端口,以及登录用户名和密码。将设备重新上电,我们应该就可以看到效果了。当连接到WiFi时,led灯闪烁2次,当登录到O2OA服务器后,led灯闪烁3次。
调试程序
arduino调试
当然,能够一次正确运行程序的,毕竟不多,所以我们可以在代码中添加一些串口输出语句进行调试。
现在主程序中初始化串口,在setup中加入代码:
Serial.begin(115200);
整个代码如下:
//引用Arduino核心库 //引用O2IOTServer类 //引用O2IOTServer类 void setup() { Serial.begin(115200); //初始化串口,波特率为115200 pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); O2_IOTServer.begin(); //启动AP接入点,并启动Web服务 O2_IOTClient.begin(); //连接WiFi,并登录到O2OA } void loop() { O2_IOTServer.listening(); //监听http请求 }
然后可以在任何位置,使用Serial.print()或者Serial.println()在串口输出信息,以便调试。如在_getToken方法中:
bool O2IOTClient::_getToken(){ //发起Post请求进行登录O2OA if (!o2host.equalsIgnoreCase("") && !o2port.equalsIgnoreCase("")){ //此处就可以输出调试信息 Serial.print("url:" ); Serial.println("http://"+o2host+":"+o2port+"/x_program_center/jaxrs/invoke/getToken/execute"); //获取登录token的url,此处是O2OA服务平台的一个接口,等会我们会创建这个接口服务 String url = "http://"+o2host+":"+o2port+"/x_program_center/jaxrs/invoke/getToken/execute"; //发起post请求,传输用户名和密码 String payload = _doPost(url, "{'user':'"+o2user+"', 'pass': '"+o2pass+"'}"); if (payload.equalsIgnoreCase("")) return false; //解析请求的返回结果,先创建json的document对象 StaticJsonDocument<256> doc; DeserializationError error = deserializeJson(doc, payload); //获取到data.token,保存到xToken变量 JsonObject json = doc["data"].as<JsonObject>(); xtoken = json["token"].as<String>(); Serial.print("xtoken:" ); Serial.println(xtoken); doc.clear(); return true; } return false; }
然后就可以使用任何串口工具,连接到设备串口,设置相同的波特率(本列中为115200),就可以看到输出信息。
VS Code也已经集成了串口工具,我们只要点击右下角的图标,就可以打开串口工具.
打开串口工具后,在右下角可调整波特率.
可以看到这里输出的请求url,同时我把token信息也输出了。
O2OA接口调试
对于接口的调试,我们也可以是使用print()方法输出调试信息,然后在平台的日志中查看。如在接口中输出请求消息体内容,代码如下:
//输出请求消息体 print(this.requestText.toString()); //将请求消息体解析为json var res = JSON.parse(this.requestText.toString()); //创建登录请求需要的消息体 var o = {"credential":res.user,"codeAnswer":res.pass}; //通过x_organization_assemble_authentication中的AuthenticationAction.codeLogin方法登录系统 this.Actions.load("x_organization_assemble_authentication").AuthenticationAction.codeLogin(o, function(json){ //获取登录的token var token = json.data.token; //将token作为响应返回给客户端 this.response.setBody({"data": {"token": token}}, "application/json"); }.bind(this));
然后打开日志,等待请求,就可以看到输出信息了。
本章就到这里,下一章,我们要连接WebSocket了。
相关推荐
物联网智能家居平台DIY:ARDUINO 物联网云平台 手机 微信.rar
本文将详细解析基于树莓派3B+与Arduino构建的家庭环境监控系统的源码实现,主要涉及物联网技术在软件和插件应用方面的知识点。 首先,我们要理解树莓派3B+和Arduino在物联网中的角色。树莓派是一款微型计算机,拥有...
基于树莓派3b+Arduino实现物联网家庭环境监控系统源码(脸识别门禁+温湿度监测+灯光控制+语音播报+火灾报警)+项目说明.7z 带系统架构图 【硬件清单】 人脸识别部分: 树莓派3b tf卡16G以上 树莓派CSI摄像头500万像素...
Arduino 是一个开源的微控制器平台,广泛应用于物联网领域。物联网(Internet of Things,IoT)是指将各种物品通过互联网连接起来,实现智能化和自动化的概念。 Arduino 和物联网的结合,将改变我们未来的生活方式...
若还需要嵌入式物联网单片机相关领域开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步。 【本人专注嵌入式领域】: 有任何使用问题欢迎随时与我联系,我会及时解答,第一时间为你提供帮助,CSDN博客端...
在物联网(IoT)开发领域,Arduino 是一个非常流行的开源硬件平台,因其简单易用而深受开发者喜爱。本文将深入探讨标题中提到的几个关键库,它们是构建 Arduino IoT 应用的重要工具。 1. **HttpPacket**:这是一个...
物联网智能家居平台DIY:Arduino+物联网云平台+手机+微信》给出了完整的物联网智能家居生态链的开发过程,用原理讲解配合实例演示的方式带领读者从最底层的传感器硬件、中间层的物联网云平台、应用硬件层的手机一直...
智能开关平台,包含服务端、硬件端、安卓端和前端。硬件使用ESP8266模块,成本相对较低,可以发挥想象力,搭配各种传感器,实现自己的智能终端。 应用场景:智能开关的应用场景比较广泛,一般家里通电即可使用的设备...
首先,物联网机器人通过集成各种先进技术,例如四麦克纳姆轮(Mecanum wheel)作为移动基础,Arduino控制器和Arduino扩展板作为主要的计算和扩展平台,传感器列阵用于收集环境信息,WLAN无线通信技术实现远程信息...
这个库可以帮助你快速连接阿里云 IoT 平台,通过和阿里云物联网开发平台配合,可快速实现各种硬件应用,包括了很上层的封装,无需自己解析数据体,绑定事件即可,在 arduino d1 wifi平台实际测试成功。
本项目是一个基于Arduino平台的物联网设备测试系统,旨在通过一系列测试程序验证和展示Arduino在物联网应用中的各种功能。项目涵盖了时间管理、数据传输、串行通信、Web服务器以及PS2接口设备等多个方面的测试。 ##...
【标题】"基于arduino的物联网蔬菜大棚检测控制系统"是一个创新的智能农业项目,它利用了arduino微控制器平台和物联网技术,实现对蔬菜大棚环境的实时监测与自动化控制。这个系统旨在提升农业生产效率,确保蔬菜生长...
本项目是一个基于Arduino的物联网设备管理系统,旨在通过Arduino平台与Firebase数据库进行交互,实现设备的远程控制、数据存储和实时监控。项目涵盖了从硬件控制到云端数据管理的完整流程,适用于智能家居、工业自动...
3. **Arduino**:Arduino是一种易于使用的开源电子平台,适合初学者和专业人士进行硬件编程。在这里,Arduino接收树莓派发送的指令,控制电机或伺服器等执行机构进行物料抓取。Arduino的优势在于简单直观的编程语言...
"Arduino" 是一个开源电子原型平台,广泛应用于DIY项目、教育和物联网(IoT)应用。它使用易于理解的编程语言和硬件接口,使得非专业程序员也能构建复杂的电子系统。 "物联网" (IoT) 是指将各种设备、物品、传感器等...
# 基于Java和Arduino的物联网通信系统 ## 项目简介 本项目是一个基于Java和Arduino的物联网通信系统示例,主要用于展示如何实现设备间的通信、数据收集和处理,以及控制设备的行为。项目中包含了消息服务、串行...
这款设备内置了Arduino兼容性,使得硬件爱好者和开发者能够方便地进行电子项目和物联网(IoT)应用的开发。"LattePanda+Arduino控制"的主题表明我们将探讨如何使用LattePanda作为控制器,利用其内置的Arduino功能来...