我是靠谱客的博主 壮观台灯,最近开发中收集的这篇文章主要介绍【华为Hilink SDK Linux系统开发】第三章:华为hilink SDK Linux系统网关适配关注嘉友创科技公众号【华为Hilink开发】目录参考Hilink SDK Linux系统适配结束【华为Hilink开发】目录,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

mark:https://blog.csdn.net/qq_24550925/article/details/107282773

关注嘉友创科技公众号

声明:文章只做技术交流,没有其他任何用途,侵权泄密立删!!


【华为Hilink开发】目录

此文章适配后,可实现APP扫描添加网关,删除网关,OTA升级网关(OTA需华为技术配合调试).

如果是wifi类单品,适配完就完了...

参考

商务审核ok以后,会发送sdk包,内有参考文档.

Hilink SDK Linux系统适配

hilink_network_adapter.c文件适配:实现网关联网给SDK提供运行条件.

接口1:获取本地ip,让sdk联网

位置:hilink-sdk-src/adapter/network_adapter/hilink_network_adapter.c


  
  
  1. /*
  2. * 获取本地ip
  3. * localIp表示存放Ip的缓冲
  4. * len表示存放Ip的缓冲长度
  5. * 返回0表示成功,返回-1表示失败
  6. * 注意: localIp为点分十进制格式
  7. */
  8. int HILINK_GetLocalIp(char *localIp, unsigned char len)

  
  
  1. /*
  2. eth_name:网卡名称,例如eth0
  3. local_ip_addr:存放获取到的IP
  4. */
  5. int USER_GetLocalIp(const char * eth_name, char *local_ip_addr)
  6. {
  7. int ret = -1;
  8. register int fd;
  9. struct ifreq ifr;
  10. user_link_status = 0;
  11. if (local_ip_addr == NULL || eth_name == NULL)
  12. {
  13. return ret;
  14. }
  15. if ((fd= socket(AF_INET, SOCK_DGRAM, 0)) > 0)
  16. {
  17. strcpy(ifr.ifr_name, eth_name);
  18. if (!( ioctl(fd, SIOCGIFADDR, &ifr)))
  19. {
  20. ret = 0;
  21. user_link_status = 1;
  22. strcpy(local_ip_addr, inet_ntoa((( struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
  23. hilink_printf( "local_ip_addr:%sn",local_ip_addr);
  24. }
  25. }
  26. if (fd > 0)
  27. {
  28. close(fd);
  29. }
  30. return ret;
  31. }

接口2:获取网络mac地址,此处只需要填充唯一值,不需要获取网络mac,如果要获取网络mac,就要先写网络mac,因为我的硬件没有网mac.所以可以先写到网络mac,然后再获取出来,我是直接读取变量,没有获取网络的mac(因为是我写的).

位置:hilink-sdk-src/adapter/network_adapter/hilink_network_adapter.c


  
  
  1. /*
  2. * 获取网络mac地址
  3. * mac表示存放MAC地址的缓冲
  4. * len表示缓冲长度
  5. * 返回0表示成功,返回-1表示失败
  6. * 注意: mac格式为a1b2c3d4e5f6
  7. */
  8. int HILINK_GetMacAddr(unsigned char *mac, unsigned char len)
  9. {
  10. //填充mac
  11. }

接口3:重启Hilink SDK,此接口非常重要:需要处理删除数据库,删除子设备,清空SDK的缓存数据等操作.

位置:hilink-sdk-src/adapter/network_adapter/hilink_network_adapter.c

注:有以下情况会调用此接口

  • SDK检查到断网,并且重连很久后依旧没网.
  • APP删除网关
  • 其他

  
  
  1. /*
  2. * 重启HiLink SDK
  3. * 若系统不可重启,建议重启HiLink进程
  4. * 返回0表示成功,返回-1表示失败
  5. */
  6. int HILINK_Restart(void)
  7. {
  8. hilink_printf( "file:%s,line:%dn", __FILE__, __LINE__);
  9. return 0;
  10. }

接口4:其他wifi相关的接口我不用适配,因为我插网线的,后期适配了在更新.

位置:hilink-sdk-src/adapter/network_adapter/hilink_network_adapter.c


hilink_softap_adapter.c文件适配:用wifi联网需要适配

接口1:其他wifi softap相关的接口我不用适配,因为我插网线的,后期适配了在更新.

位置:hilink-sdk-src/adapter/network_adapter/hilink_softap_adapter.c


hilink_sdk_adapter.c文件适配:实现指示sdk运行情况

接口1:网关设备的网络状态指示,可以适配指示哪个灯亮.

位置:hilink-sdk-src/adapter/sdk_adapter/hilink_sdk_adapter.c

注:SDK连上服务器之后,如果网关下面有子设备,需要在这里面调用子设备上线的函数,如下

  • HilinkSyncBrgDevStatus(sn, DEV_ONLINE);        //上线
  • HilinkSyncBrgDevStatus(sn, DEV_ADD);        //设备恢复出厂之后重新注册

以上两个参数都可以,因为存在一种情况,网关没有网络,子设备已经加入成功了需要调用DEV_ADD,普通上线DEV_ONLINE,所以使用DEV_ADD比较好!!!

普通上线DEV_ONLINE,不能使用DEV_ADD,因为DEV_ADD会造成服务器修改设备ID,导致场景下的设备全部被删除.


  
  
  1. /*
  2. * 通知设备的状态
  3. * status表示设备当前的状态
  4. * 注意,此函数由设备厂商根据产品业务选择性实现
  5. */
  6. void hilink_notify_devstatus(int status)
  7. {
  8. switch(status){
  9. case HILINK_M2M_CLOUD_OFFLINE: /* 设备与云端连接断开(版本向前兼容) */
  10. hilink_printf( "device disconnected!n");
  11. break;
  12. case HILINK_M2M_CLOUD_ONLINE: /* 设备连接云端成功,处于正常工作态(版本向前兼容) */
  13. hilink_printf( "device connected!n");
  14. break;
  15. case HILINK_LINK_CONNECTED_WIFI: /* 设备已经连上路由器 */
  16. hilink_printf( "device connected to internet!n");
  17. break;
  18. case HILINK_M2M_CONNECTTING_CLOUD: /* 设备正在连接云端 */
  19. hilink_printf( "device connecting to cloud!n");
  20. break;
  21. default:
  22. hilink_printf( "ok:%dn",status);
  23. break;
  24. }
  25. return;
  26. }

接口2:网关重启前需要处理哪些事情,我这边不处理,直接返回0,即可同意重启.

位置:hilink-sdk-src/adapter/sdk_adapter/hilink_sdk_adapter.c


  
  
  1. /*
  2. * 实现模组重启前的设备操作
  3. * flag为0表示HiLink SDK 线程看门狗触发模组重启; 为1表示APP删除设备触发模组重启
  4. * 返回0表示处理成功, 系统可以重启,使用硬重启; 返回1表示处理成功, 系统可以重启,使用软重启;
  5. * 返回负值表示处理失败, 系统不能重启
  6. * 注意,此函数由设备厂商实现;若APP删除设备触发模组重启时,设备操作完务必返回0,否则会导致删除设备异常
  7. */
  8. int hilink_process_before_restart(int flag)
  9. {
  10. hilink_printf( "file:%s,line:%dn", __FILE__, __LINE__);
  11. hilink_printf( "flag:%dn",flag);
  12. /* HiLink SDK线程看门狗超时触发模组重启 */
  13. if (flag == HILINK_REBOOT_WATCHDOG) {
  14. /* 实现模组重启前的操作(如:保存系统状态等) */
  15. return 0;
  16. }
  17. /* APP删除设备触发模组重启 */
  18. if (flag == HILINK_REBOOT_DEVDELETE) {
  19. /* 实现模组重启前的操作(如:保存系统状态等) */
  20. return 0;
  21. }
  22. return -1;
  23. }

接口3:其他接口不用适配,故障码我不获取.

位置:hilink-sdk-src/adapter/network_adapter/hilink_network_adapter.c


hilink_ota.c文件适配:实现升级网关程序

接口1:获取网关当前版本,我的是10.

位置:hilink-sdk-src/adapter/network_adapter/hilink_ota.c
 


  
  
  1. #define OTA_VERION "10"
  2. /*
  3. * 获取MCU当前版本
  4. * version表示版本字符串
  5. * inLen表示输入字符串长度
  6. * outLen表示输出字符串长度
  7. * 返回值是RETURN_OK时,表示获取成功
  8. * 返回值是RETURN_ERROR_NO_MCU时,表示没有MCU
  9. * 返回值是RETURN_ERROR时,表示获取失败
  10. * 注意:
  11. * 如果获取不到MCU的版本,则不对MCU进行升级。
  12. * 建议厂商在MCU正常启动后,或升级启动后,就将MCU的版本号传递给模组,确保模组可以获取到MCU的版本。
  13. */
  14. int HilinkGetMcuVersion(char *version, unsigned int inLen, unsigned int *outLen)
  15. {
  16. /* 厂商实现此接口 */
  17. char ver[ 20];
  18. memset(ver, 0, sizeof(ver));
  19. memcpy(ver,OTA_VERION, strlen(OTA_VERION));
  20. memcpy(version,ver, strlen(ver));
  21. *outLen = strlen(ver);
  22. hilink_printf( "ver:%s,outLen:%dn", ver, *outLen);
  23. return RETURN_OK;
  24. return RETURN_ERROR_NO_MCU;
  25. }

接口2:获取设备升级文件保存路径,linux系统,设置个路径和保存的文件名,sdk会把升级文件下载下来.然后结束,很简单

位置:hilink-sdk-src/adapter/network_adapter/hilink_ota.c


  
  
  1. #define OTA_PATH "/root/APP-OTA"
  2. /*
  3. * 获取设备升级文件保存路径
  4. * filePath表示设备升级文件保存路径
  5. * len表示设备升级文件保存路径的长度
  6. * 返回值是RETURN_OK时,表示获取成功
  7. * 返回值是RETURN_ERROR时,表示获取失败
  8. * 注意:
  9. * Linux系统和安卓系统需要适配此接口,其他操作系统不用适配此接口。
  10. * HiLink SDK下载的设备升级文件需保存在设备上的某个文件路径下;
  11. * 此文件路径,需由厂商适配提供,例如“/var/update.bin”。
  12. */
  13. int HILINK_GetUpdateFilePath(char *filePath, unsigned int len)
  14. {
  15. hilink_printf( "---------------------HILINK_GetUpdateFilePath-------------------n");
  16. hilink_printf( "file:%s,line:%dn", __FILE__, __LINE__);
  17. hilink_printf( "filePath:%s,len:%dn", filePath,len);
  18. /* 厂商实现此接口 */
  19. char path[ 128];
  20. memset(path, 0, sizeof(path));
  21. memcpy(path,OTA_PATH, strlen(OTA_PATH));
  22. //保存路径
  23. memcpy(filePath,path, strlen(path));
  24. len = strlen(path);
  25. hilink_printf( "filePath:%s,len:%dn", filePath,len);
  26. return RETURN_OK;
  27. }

接口3:网关升级结束,我是调用Sethilink_otaPtr,修改数据库标记,重启程序后,处理OTA的文件,然后运行这个文件,不运行之前的默认文件了.

位置:hilink-sdk-src/adapter/network_adapter/hilink_ota.c


  
  
  1. /*
  2. * 模组升级结束
  3. * status表示升级结果
  4. * 当status是100时,表示升级成功
  5. * 当status不是100时,表示升级失败
  6. * 返回值是RETURN_OK时,表示处理成功,HiLink SDK将置升级标志或切换运行区标志
  7. * 返回值不是RETURN_OK时,表示处理不成功,HiLink SDK将终止本次升级流程
  8. * 注意:
  9. * HiLink SDK在将固件写入到OTA升级区后,且完整性校验通过后,将调用厂商适配的此接口;
  10. * 厂商可在此接口中完成和升级流程相关的处理。
  11. * 自动升级流程在凌晨进行,因此厂商在实现升级流程相关功能时,确保在升级的下载安装固件和重启设备时避免对用户产生影响,
  12. * 比如发出声音,光亮等;升级类型是否为自SL-D0Z0-W02-Hilink-V动升级可参考接口HilinkOtaStartProcess的参数type的描述。
  13. */
  14. int HilinkOtaEndProcess(int status)
  15. {
  16. hilink_printf( "file:%s,line:%dn", __FILE__, __LINE__);
  17. Sethilink_otaPtr(This,status);
  18. if(status == 100)
  19. {
  20. hilink_printf( "Hilink OTA OK n");
  21. } else{
  22. hilink_printf( "Hilink OTA error n");
  23. }
  24. /* 厂商实现此接口 */
  25. return RETURN_OK;
  26. }

接口4:其他接口用不着,不是linux系统的话需要适配.

位置:hilink-sdk-src/adapter/network_adapter/hilink_ota.c


hilink_profile_adapter.c文件适配:实现用户网关连云的校验和数据交互

接口1:获取AC和BI两个变量的值,用于公司账号的加密啥的.

位置:hilink-sdk-src/adapter/profile_adapter/hilink_profile_adapter.c

注:这两个变量从哪里来呢?当我在华为开发者联盟注册中控主机后,即可下载到这两个文件,打开后转成16进制复制过来就行了.

提醒:linux下有命令使用十六进制方式打开文件.


  
  
  1. /* 获取加密 AC 参数 */
  2. unsigned char *hilink_get_auto_ac(void)
  3. {
  4. hilink_printf( "file:%s,line:%dn", __FILE__, __LINE__);
  5. return A_C;
  6. }
  7. /* 获取加密 BI 参数 */
  8. char *hilink_get_auto_bi_rsa_cipher(void)
  9. {
  10. hilink_printf( "file:%s,line:%dn", __FILE__, __LINE__);
  11. return bi_rsacipher;
  12. }

 接口2:修改服务当前字段值,当APP控制网关,数据就从这个接口过来的,非常重要的接口.

位置:hilink-sdk-src/adapter/profile_adapter/hilink_profile_adapter.c

 


  
  
  1. /*
  2. * 修改服务当前字段值
  3. * svcId为服务的ID,payload为接收到需要修改的Json格式的字段与其值,len为payload的长度
  4. * 返回0表示服务状态值修改成功,不需要底层设备主动上报,由Hilink Device SDK上报;
  5. * 返回-101表示获得报文不符合要求;
  6. * 返回-111表示服务状态值正在修改中,修改成功后底层设备必须主动上报;
  7. */
  8. int hilink_put_char_state(const char *svcId, const char *payload, unsigned int len)
  9. {
  10. }

接口3:获取服务字段值,当APP控制网关后,会调用一次这个接口,意思是,我控制网关的数据,网关收到了吗?

位置:hilink-sdk-src/adapter/profile_adapter/hilink_profile_adapter.c


  
  
  1. /*
  2. * 获取服务字段值
  3. * svcId表示服务ID。厂商实现该函数时,需要对svcId进行判断;
  4. * in表示接收到的Json格式的字段与其值;
  5. * inLen表示接收到的in的长度;
  6. * out表示保存服务字段值内容的指针,内存由厂商开辟,使用完成后,由Hilink Device SDK释放;
  7. * outLen表示读取到的payload的长度;
  8. * 返回0表示服务状态字段值获取成功,返回非0表示获取服务状态字段值不成功。
  9. */
  10. int hilink_get_char_state(const char *svcId, const char *in, unsigned int inLen, char **out, unsigned int *outLen)
  11. {
  12. }

接口3:获取网关的SN,版本:唯一值,给一个就行

位置:hilink-sdk-src/adapter/profile_adapter/hilink_profile_adapter.c


  
  
  1. /*
  2. * 获取设备sn号
  3. * 注意: sn指向的字符串长度为0时将使用设备mac地址作为sn
  4. */
  5. void HilinkGetDeviceSn(unsigned int len, char *sn)
  6. {
  7. }
  8. /*
  9. * 获取设备相关版本号
  10. * 返回0表示版本号获取成功,返回其他表示版本号获取失败
  11. * 注意,此接口为HiLink内部调用函数
  12. */
  13. int getDeviceVersion(char **firmwareVer, char **softwareVer, char **hardwareVer)
  14. {
  15. // hilink_printf("file:%s,line:%dn", __FILE__, __LINE__);
  16. *firmwareVer = FIRMWARE_VER;
  17. *softwareVer = SOFTWARE_VER;
  18. *hardwareVer = HARDWARE_VER;
  19. return 0;
  20. }

接口4:其他接口用不着

位置:hilink-sdk-src/adapter/profile_adapter/hilink_profile_adapter.c


 

结束

【华为Hilink开发】目录

最后

以上就是壮观台灯为你收集整理的【华为Hilink SDK Linux系统开发】第三章:华为hilink SDK Linux系统网关适配关注嘉友创科技公众号【华为Hilink开发】目录参考Hilink SDK Linux系统适配结束【华为Hilink开发】目录的全部内容,希望文章能够帮你解决【华为Hilink SDK Linux系统开发】第三章:华为hilink SDK Linux系统网关适配关注嘉友创科技公众号【华为Hilink开发】目录参考Hilink SDK Linux系统适配结束【华为Hilink开发】目录所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部