开源OA办公平台搭建教程:O2OA+Arduino实现物联网应用(四)
之前我们通过O2IOTServer类已经实现了设备的初始化配置,现在我们需要使用配置信息,连接到可以用的WiFi,并连接登录到O2OA服务器。
创建O2IOTClient类
在o2iot目录下创建文件:O2IOTClient.h,代码如下:
#ifndef O2IOTCLIENT_H_
#define O2IOTCLIENT_H_#include <ESP8266WiFiMulti.h> //引用ESP8266的WiFi库
#include <ESP8266HTTPClient.h> //引用ESP8266的HttpClient库
#include <EEPROM.h> //引用EEPROM库
#include "ArduinoJson.h" //引用ArduinoJson库class O2IOTClient {
public://配置信息变量String xtoken="";String o2host="";String o2port="";String o2user="";String o2pass="";bool begin(); //初始化client,连接WiFi,并登录O2OAbool connect(); //连接WiFiString _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,并获取tokenchar _ssidConfig[128]; //配置信息存储128字节char *ssid_name; //热点名称char *ssid_pass; //热点密码
};
extern O2IOTClient O2_IOTClient;#endif /* O2IOTCLIENT_H_ */
然后我们需要创建.cpp来实现头文件中定义的方法,所以在o2iot目录下创建文件:O2IOTClient.cpp,代码如下:
#include "O2IOTClient.h"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服务器,并获取toeknblink(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,返回truereturn true;}return false;}return false;
}bool O2IOTClient::_getToken(){ //发起Post请求进行登录O2OAif (!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); //HTTPhttp.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); //HTTPhttp.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){//获取登录的tokenvar token = json.data.token;//将token作为响应返回给客户端this.response.setBody({"data": {"token": token}}, "application/json");
}.bind(this));
在O2OA中创建用户
我们需要在O2OA服务器创建一个用户,用于设备登录,创建用户过程,请自行查阅文档。在此我创建了一个叫做iot的用户。
在设备主程序中调用
我们回到o2iot.ino文件,更新一下代码,调用O2IOTClient类。
#include "Arduino.h" //引用Arduino核心库
#include "O2IOTServer.h" //引用O2IOTServer类
#include "O2IOTClient.h" //引用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);
整个代码如下:
#include "Arduino.h" //引用Arduino核心库
#include "O2IOTServer.h" //引用O2IOTServer类
#include "O2IOTClient.h" //引用O2IOTServer类void setup() {Serial.begin(115200); //初始化串口,波特率为115200pinMode(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请求进行登录O2OAif (!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){//获取登录的tokenvar token = json.data.token;//将token作为响应返回给客户端this.response.setBody({"data": {"token": token}}, "application/json");
}.bind(this));
然后打开日志,等待请求,就可以看到输出信息了。
本章就到这里,下一章,我们要连接WebSocket了。
开源OA办公平台搭建教程:O2OA+Arduino实现物联网应用(四)相关推荐
- 开源OA办公平台搭建教程:O2OA+Arduino实现物联网应用(五)
我们已经登录到了O2OA服务器,本章就要连接Websocket,接收服务器的消息. 创建O2IOTWebsocket类 在o2iot目录下创建文件:O2IOTWebsocket.h,代码如下: #if ...
- 开源OA办公平台搭建教程:O2OA表单中的事件
1. 概述 我们设计表单的时候经常会有这样的需求:在表单或者组件加载前/加载后,能够执行一些脚本来改变表单或组件的样式和行为.或者用户在点击组件的时候能够执行脚本.表单的事件就是为这样的场景而设计. ...
- 开源OA办公平台搭建:流程开发中常见的正则表达式
在线测试正则地址 https://tool.oschina.net/regex/ 腾讯QQ号 腾讯QQ号从10000开始 [1-9][0-9]{4,} 中国邮政编码 中国邮政编码为6位数字 [1-9] ...
- 开源OA协同办公平台搭建教程:开源O2OA中log4j2使用配置
O2OA应用开发平台是兰德纵横网络技术股份有限公司精心打造的一款开源办公产品,是使用JavaEE技术栈,分布式架构设计的真正全代码开源的企业应用定制化开发平台,平台既可以支持小企业的OA协同办公系统快 ...
- 开源OA协同办公平台搭建教程丨服务器端命令:数据导入导出及配置
O2OA应用开发平台是一款开源办公产品,是使用JavaEE技术栈,分布式架构设计的真正全代码开源的企业应用定制化开发平台,平台既可以支持小企业的OA协同办公系统快速搭建,也能支持复杂的集团化大型协同门 ...
- 开源OA协同办公平台搭建教程:服务管理中接口的调用权限
O2OA应用开发平台是兰德纵横网络技术股份有限公司精心打造的一款开源办公产品,是使用JavaEE技术栈,分布式架构设计的真正全代码开源的企业应用定制化开发平台,平台既可以支持小企业的OA协同办公系统快 ...
- O2OA开源免费开发平台搭建教程:系统配置中,主要配置文件的说明详情
O2OA开发平台有比较多的配置文件,目前多数配置已经已经可以直接在WEB端进行修改.本章节主要讲述O2OA信息化系统开发平台支持的配置文件以及各项配置相关的用途说明. 系统配置文件分成两类: loca ...
- 开源协同办公平台部署教程:O2OA PAAS平台部署
一.镜像制作 1.将安装介质o2server-5.0.3-linux.zip上传至镜像制作服务器上.(上传目录为/paas/xxhpaas/moka/o2oa) 2.使用unzip命令解压安装包,参考 ...
- 用全开源的协同OA办公平台,可以自己搭建OA啦!
今天给大家介绍的,确确实实是一款鲜为人知,但是好用的全开源协同OA项目,它的名字叫做:O2OA企业应用开发平台(简称O2OA平台). O2OA平台是什么? O2OA开源企业应用开发平台基于J2EE分布 ...
最新文章
- 跨平台表空间传输(linux 10g表空间跨平台迁移到window 11g)
- R基于H2O包构建深度学习模型实战
- [20160910]低级错误.txt
- 搜索引擎优化 SEO
- cat命令读取一部分_脚本攻略2 --命令之花
- android+mysql+server+error_Lost connection to MySQL server during query错误 | 学步园
- inline-block的兼容性问题
- TikTok测试三分钟视频、Reddit首次公布DAU、谷歌解雇人工智能领头人、年度最受欢迎应用|Decode the Week...
- [C++基础]032_常用的字符串处理函数(strcat,strcpy,strcmp,strupr,strlwr,strlen)...
- 解决Ubuntu 16.04下提示boot分区空间不足的办法
- c java开发对比_编程语言:Java和C语言的比较,你更偏向于哪个?老程序员:选C...
- 虚拟Python环境可以这样创建
- Compile error: Cannot find a C++ compiler that supports both C++11 and the specified C++ flags
- iOS学习笔记总结整理
- 【优化算法】多目标利希滕贝格算法(MOLA)【含Matlab源码 1434期】
- 无线串口模块SX1278的使用后记
- 谷歌浏览器小恐龙作弊无敌代码
- mocha 测试 mysql_GitHub - nodejs-xx/lei: 整合Express mysql ioredis ejs 的一开发框架,使用mocha对api进行测试...
- 2021年上海理工大学《高等代数》试卷和答案(蔡宇编辑)
- SWUST OJ 77: 计算员工周工资
热门文章
- 2022年计网《宿舍网有线无线一体化项目》总结
- Arduino 有源蜂鸣器实验
- 简易公交车查询系统c语言,公交线路免费api接口代码
- Hyperledger系列(十二)MSP详细介绍
- 软考高级论文 信息系统管理师 软件管理
- .metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\问题
- npm下载什么都报错ERRO -4048
- python自动化测试第三次课-----数据类型,list,元组,切片,字典
- 计算机领域经典故事,[转载]计算机的工作原理(1):一个经典的故事
- 用python发送put请求