失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Arduino 告警通知五部曲 ① 微信告警

Arduino 告警通知五部曲 ① 微信告警

时间:2021-10-23 02:00:15

相关推荐

Arduino 告警通知五部曲 ① 微信告警

专栏介绍

能够实现数行代码即可在Arduino中接入告警功能,包括微信、QQ、飞书、钉钉等多个告警方式。

订阅用户须知

订阅后私聊博主获取源码(搜索QQ:2421818708),专栏上遇到的问题尽可咨询。

🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请留言轰炸哦!及时修正!感谢支持!🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝

微信告警

1、背景2、微信告警2.1 企业微信配置2.1.1 第一步,注册企业2.1.2 第二步,获取企业ID2.1.3 第三步,创建应用2.1.4 第四步,微信接收企业微信通知2.1.5 第五步,测试消息推送3、对接企业微信开放者平台3.1 access_token 接口凭证3.2 构造消息体3.3 发送消息4、WeChatMessageIoTSDK实现4.1 实现access_token 接口凭证4.2 实现构造消息体4.3 实现发送消息5、测试SDK效果5.1 测试代码5.2 测试结果5.2.1 串口打印结果5.2.2 打开微信,看消息

1、背景

在我们做Arduino项目(特别是环境监测、数据报警等等)开发学习的时候,总会考虑要是这些信息能够通知到我的微信、钉钉、飞书等等常用app的时候就好了。

现在,这些不再是高深想法,跟着鸟哥来学习,可以实现快速简单接入,并且提供对应案例代码以方便直接运行感受实验效果。

关于告警通知,鸟哥会循序渐进,计划五部曲,分别为:

腾讯科技微信告警腾讯科技QQ告警字节跳动飞书告警阿里巴巴钉钉告警整合以上四者到NodeJs服务器,业务控制用服务代码实现

那么接下来,让我们接入第一篇 —— 微信告警。

2、微信告警

微信作为当前国内最大的社交app,我们当然希望能结合智能硬件一起使用。这就不得不说微信开放平台的一些能力 —— 微信消息推送(一般也叫作推送消息提醒)。

这里我们对接的是企业微信api(后面有说明),然后再通过微信app关注企业微信即可以在微信上同步收到企业微信的推送消息。

接下来,请根据我的步骤来配置环境。

2.1 企业微信配置

2.1.1 第一步,注册企业

用电脑打开企业微信官网 (https://work./),注册一个企业,名称随意。

比如博主这里注册了一个叫做单片机菜鸟的企业

2.1.2 第二步,获取企业ID

进入「我的企业」页面,拉到最下边,可以看到企业ID(后续会用到,这里了解即可)

2.1.3 第三步,创建应用

注册成功后登录,点「应用管理」进入应用管理界面,选择 → 「自建」 → 「创建应用

这里博主创建了一个叫做机器人推送提醒‘’。「应用logo」随意上传图片,「应用名称」随意填写

这里会得到应用ID( agentid ),应用密钥Secret( secret ),这两个参数在后期对接也是非常有用的。

2.1.4 第四步,微信接收企业微信通知

进入「我的企业」 → 「微信插件」,扫描下方二维码,关注以后即可收到推送的消息。

比如博主关注了单片机菜鸟企业。

2.1.5 第五步,测试消息推送

这时候我们可以测试一下消息推送,也就是步骤三的创建应用里面的发送消息。

3、对接企业微信开放者平台

官方文档 https://developer.work./document/path/90487

企业微信提供了通讯录管理、客户联系、身份验证、应用管理、消息推送(这是我们重点关注的内容)、素材管理、OA、效率工具、企业支付、企业互联、会话内容存档、电子发票、家校沟通、家校应用、政民沟通等API,企业可以使用这些API,为企业接入更多个性化的办公应用。

第一步,获取access_token第二步,构造消息体第三步,发送消息

后面我们实现Arduino代码或者NodeJs代码也是依赖于这三个步骤来。

3.1 access_token 接口凭证

access_token是应用调用api的凭证(官方总不能让你无限制调用接口),由corpid(企业ID)和corpsecret(应用密钥)换取。

请求方式:GET(HTTPS)

请求URL:https://qyapi./cgi-bin/gettoken?corpid=ID&corpsecret=SECRET

通过这个请求我们即可得到 access_token 。

3.2 构造消息体

支持非常多的消息类型。

官方文档说明 https://developer.work./document/path/90236#10167 强烈建议多看看官方文档说明

可以发送文本、图片、视频等多种类型的应用消息,这里以最简单的文本消息为例:(注意修改touser、agentid为自己想要的接收者userid列表、应用id)。

{"touser" : "单片机菜鸟1|单片机菜鸟2","msgtype" : "text","agentid" : 1000002,"text" : {"content" : "来自于单片机菜鸟的通知"},"safe":0}

3.3 发送消息

以上面两步得到的access_token和消息体为参数。发起一个HTTP post请求

请求方式:POST(HTTPS)

请求地址:https://qyapi./cgi-bin/message/send?access_token=ACCESS_TOKEN

很多注意事项也要看看。

原理讲完,接下来我们看看Arduino代码如何实现。

4、WeChatMessageIoTSDK实现

鸟哥假设我们经过上面步骤得到一些必须信息:

企业ID

应用ID和应用密钥

企业微信提供了很多有用的功能,这里只关注消息推送。(调用api的过程,本质上就是发送http请求给企业微信后台

第一步,获取access_token第二步,构造消息体第三步,发送消息

具体库源文件可以直接找鸟哥(QQ:2421818708)要,或者直接把步骤里面的所有代码集合一起即可。

4.1 实现access_token 接口凭证

access_token是应用调用api的凭证(官方总不能让你无限制调用接口),由corpid(企业ID)和corpsecret(应用密钥)换取。

请求方式:GET(HTTPS)

请求URL:https://qyapi./cgi-bin/gettoken?corpid=ID&corpsecret=SECRET

通过这个请求我们即可得到 access_token 。

sdk对应代码:

char* WeChatMessageIoTSDK::getToken(){char token[300];if(https.begin(*client, WECHAT_API_GET_TOKEN)) {// HTTPSSerial.print("[WECHAT] getToken...\n");// start connection and send HTTP headerint httpCode = https.GET();// httpCode will be negative on errorif(httpCode > 0) {// HTTP header has been send and Server response header has been handledSerial.printf("[WECHAT] GET... code: %d\n", httpCode);// file found at serverif (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {String payload = https.getString();Serial.println(payload);StaticJsonDocument<1000> doc;DeserializationError error = deserializeJson(doc, payload); //反序列化JSON数据if (!error) //检查反序列化是否成功{JsonVariant root = doc.as<JsonVariant>();int errcode = root["errcode"];if (errcode == 0){const char* accessToken = root["access_token"];sprintf(token, "%s", accessToken);Serial.printf("[WECHAT] token: %s\n",token);return token;} else {Serial.print("[WECHAT] token Error...\n");}}} else {Serial.printf("[WECHAT] GET... failed, error: %s\n", https.errorToString(httpCode).c_str());}https.end();}} else {Serial.printf("[HTTPS] Unable to connect\n");}return NULL;}

4.2 实现构造消息体

sdk对应代码:

#define MESSAGE_BODY_FORMAT "{\"touser\":\"%s\",\"msgtype\":\"text\",\"agentid\":%d,\"text\":{\"content\":\"%s\"},\"safe\":0}"

4.3 实现发送消息

以上面两步得到的access_token和消息体为参数。发起一个post请求

请求方式:POST(HTTPS)

请求地址:https://qyapi./cgi-bin/message/send?access_token=ACCESS_TOKEN

sdk对应代码:

bool WeChatMessageIoTSDK::sendMessage(const char *token, const char *payload){char jsonBuf[1024];sprintf(jsonBuf, MESSAGE_BODY_FORMAT, toUser, agentID, payload);sprintf(WECHAT_API_SEND_MSG, WECHAT_API_SEND_MSG_FORMAT, token);Serial.println(jsonBuf);Serial.println(WECHAT_API_SEND_MSG);bool sendMessageOK = false;if(https.begin(*client, WECHAT_API_SEND_MSG)) {// HTTPSSerial.print("[WECHAT] getToken...\n");// start connection and send HTTP headerint httpCode = https.POST(jsonBuf);// httpCode will be negative on errorif(httpCode > 0) {// HTTP header has been send and Server response header has been handledSerial.printf("[WECHAT] POST... code: %d\n", httpCode);// file found at serverif (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {String payload = https.getString();Serial.println(payload);sendMessageOK = true;} else {Serial.printf("[WECHAT] POST... failed, error: %s\n", https.errorToString(httpCode).c_str());sendMessageOK = false;}https.end();}}else {Serial.printf("[HTTPS] Unable to connect\n");}return sendMessageOK;}

接下来,我们测试一下效果。

5、测试SDK效果

5.1 测试代码

/*** 时间:-04-30* 描述:*测试微信提醒*/#include <ESP8266WiFi.h>#include <stdlib.h>#include <Ticker.h>#include "WeChatMessageIoTSDK.h"/******************* 常量声明 **********************/#define SSID "TP-LINK_5344"// 填入自己的WiFi账号#define PASSWORD "xxxxxx"// 填入自己的WiFi密码//---------------- 企业微信相关配置信息 ------------------//// 二元组信息#define CORP_ID "xxxxxx"// 企业ID#define CORP_SECRET "xxxxxx"// 应用密钥#define AGENT_ID 1000002 // 应用ID#define TO_USER "@all" // 发送给所有人#define INTERVAL 10000 // 读取时间间隔,默认10s//---------------- 巴法云相关配置信息 ------------------///******************* 函数声明 **********************/void initWifiConnect(void); // 初始化Wifi连接void doWiFiConnectTick(void); // 检测WiFi连接状态void initWeChatIotSDK(void); // 初始化微信IOT SDKvoid sendDataToWeChat(void); // 发送文本到微信/******************* 函数声明 **********************//******************* 变量定义 **********************/Ticker delayTimer; // 表示定时模块,用来做一个定时器unsigned long previousMillis = 0; // 记录上次读取的时间戳/******************* 变量定义 **********************//*** 初始化*/void setup() {delay(2000);// 延时2秒,用于等待系统上电稳定Serial.begin(115200); // 初始化串口,波特率 115200Serial.println(""); // 串口默认先换行显示Serial.println("测试微信消息提醒~"); // 串口打印信息表示项目启动~initWifiConnect(); // 初始化Wifi连接initWeChatIotSDK(); // 初始化企业微信信息ESP.wdtEnable(5000); // 启用看门狗}void loop() {ESP.wdtFeed();// 定时喂狗unsigned long currentMillis = millis(); // 获取当前时间戳doWiFiConnectTick(); // wifi连接状态检测以及重连if(currentMillis - previousMillis >= INTERVAL) // 每隔一段时间 interval为时间间隔{previousMillis = currentMillis; // 记录当前时间戳sendDataToWeChat();}delay(2000); // 延时2秒}/*** 检测WiFi连接状态*/void doWiFiConnectTick(void){static uint32_t lastWiFiCheckTick = 0; // 记录最近一次检测WiFi连接状态的时间点static uint32_t disConnectCount = 0; // 记录WiFi断开连接的次数if(WiFi.status() == WL_CONNECTED) // 当前WiFi处于连接状态{disConnectCount = 0;// 重置WiFi断开连接为0return;}if(millis() - lastWiFiCheckTick > 1000) // 检测间隔大于1秒{lastWiFiCheckTick = millis(); // 记录时间点Serial.println("WiFi disConnect!"); // 串口输出.表示设备已经断开连接disConnectCount++;// WiFi断开连接的次数累计加1if(disConnectCount>=40) // 断开连接累计次数达到40次,表示可能wifi连接异常{delayRestart(1);//一直连接不上就重启ESP系统}}}/*** 延时t秒后重启ESP* @param t t秒*/void delayRestart(float t){Serial.print("Restart after ");Serial.print(t);Serial.println("s");// 开启一个定时器,定时时间为t秒delayTimer.attach(t, []() {Serial.println("\r\nRestart now!");ESP.restart();// 重启ESP模块});}/*** 初始化Wifi连接*/void initWifiConnect(void){Serial.printf("Connecting to WiFi:%s\n",SSID);// 串口打印当前WiFi热点的名字WiFi.disconnect(); // 默认断开之前的连接,回归初始化非连接状态WiFi.mode(WIFI_STA); // 设置ESP工作模式为Station模式WiFi.begin(SSID, PASSWORD); // 连接到WiFiint cnt = 0; // 记录重试次数while (WiFi.status() != WL_CONNECTED) // 当还没有连接上WiFi热点时{delay(1000); // 延时等待1秒cnt++; // 累计次数+1Serial.print("."); // 串口输出.表示设备正在连接WiFi热点if(cnt>=40) // 超过40秒还没有连接上网络{delayRestart(1); //一直连接不上就重启ESP系统}}Serial.println(WiFi.localIP()); // 打印当前IP地址}/*** 初始化微信IOT SDK*/void initWeChatIotSDK(void){// 初始化 iot sdkWeChatMessageIoTSDK::begin(CORP_ID, CORP_SECRET, AGENT_ID, TO_USER);}/*** 发送数据*/void sendDataToWeChat(void){WeChatMessageIoTSDK::sendText("这里是8266 收到请回复!");}

这里的效果是每隔一段时间给微信发送一条消息。

这里是8266 收到请回复!

这里接入sdk非常简单,只需要调用初始化方法之后,可以在适当时机调用一下sendText方法即可完美。

5.2 测试结果

5.2.1 串口打印结果

5.2.2 打开微信,看消息

自此,我们就可以愉快接入微信消息提醒,接入鸟哥写的微信提醒sdk,调用两行代码即可快速接入。

如果觉得《Arduino 告警通知五部曲 ① 微信告警》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。