历史上的今天
返回首页

历史上的今天

今天是:2024年09月06日(星期五)

正在发生

2019年09月06日 | 基于STM32实现MQTT

2019-09-06 来源:eefocus

1、MQTT协议

    MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

   协议详情: MQTT Version 3.1.1(英文版)

                    (中文版)

2、STM32实现的自我理解

   既然是一个协议,所以有一个基本的物理网络层就可以实现

   将就手上的一个ESP8266无线wifi串口模块,一个STM32的板子。也就可以完成MQTT的测试了。

   一般来说在协议中扮演的是一个客户端。主要的工作就是连接服务器、订阅消息、发送消息几个功能。最开始我在网上找了MQTT的客户端代码包,打开一看就蒙了。太多、太杂了,完全大于了我们的需求。所以我自己通过抓包对着协议写了一个数据包生成代码。

3、测试前准备

   MQTT服务器:我用的是Apollo Console(账号默认为:admin 密码默认:password 后面连接时要用)

   MQTT客户端: 通信猫。

   具体怎么用大家百度。。。

4、代码实现

4.1、固定报头 Fixed header

类型:

标志位:

根据这个可以写一个生成固定头的函数

 
  1. #define MQTT_TypeCONNECT 1//请求连接

  2. #define MQTT_TypeCONNACK 2//请求应答

  3. #define MQTT_TypePUBLISH 3//发布消息

  4. #define MQTT_TypePUBACK 4//发布应答

  5. #define MQTT_TypePUBREC 5//发布已接收,保证传递1

  6. #define MQTT_TypePUBREL 6//发布释放,保证传递2

  7. #define MQTT_TypePUBCOMP 7//发布完成,保证传递3

  8. #define MQTT_TypeSUBSCRIBE         8//订阅请求

  9. #define MQTT_TypeSUBACK 9//订阅应答

  10. #define MQTT_TypeUNSUBSCRIBE                 10//取消订阅

  11. #define MQTT_TypeUNSUBACK 11//取消订阅应答

  12. #define MQTT_TypePINGREQ 12//ping请求

  13. #define MQTT_TypePINGRESP 13//ping响应

  14. #define MQTT_TypeDISCONNECT                 14//断开连接

  15. unsigned char GetDataFixedHead(unsigned char MesType,unsigned char DupFlag,unsigned char QosLevel,unsigned char Retain)

  16. {

  17. unsigned char dat = 0;

  18. dat = (MesType & 0x0f) << 4;

  19. dat |= (DupFlag & 0x01) << 3;

  20. dat |= (QosLevel & 0x03) << 1;

  21. dat |= (Retain & 0x01);

  22. return dat;

  23. }

 

4.2、连接

连接时抓的包的:

根据协议分析

 

固定报头 Fixed header

也就是数据包前两个10 21

后面是可变头:协议名、协议级别、连接标志、清除会话、遗嘱标志、遗嘱、遗嘱保留、用户名标志、密码标志、保持连接。

然后是有效载荷:客户端标识符、遗嘱主题、遗嘱消息、用户名、密码。

 
  1. #define MQTT_StaCleanSession 1 //清理会话

  2. #define MQTT_StaWillFlag 0 //遗嘱标志

  3. #define MQTT_StaWillQoS 0 //遗嘱QoS连接标志的第4和第3位。

  4. #define MQTT_StaWillRetain 0 //遗嘱保留

  5. #define MQTT_StaUserNameFlag 1 //用户名标志 User Name Flag

  6. #define MQTT_StaPasswordFlag 1 //密码标志 Password Flag

  7. #define MQTT_KeepAlive         60       //心跳包秒数

  8. #define MQTT_ClientIdentifier         "test"                          //客户端标识符 Client Identifier

  9. #define MQTT_WillTopic "" //遗嘱主题 Will Topic

  10. #define MQTT_WillMessage "" //遗嘱消息 Will Message

  11. #define MQTT_UserName "admin" //用户名 User Name

  12. #define MQTT_Password "password" //密码 Password

  13. void GetDataConnet(unsigned char *buff)//获取连接的数据包正确连接返回20 02 00 00

  14. {

  15. unsigned int i,len,lennum = 0;

  16. unsigned char *msg;

  17. buff[0] = GetDataFixedHead(MQTT_TypeCONNECT,0,0,0);

  18. buff[2] = 0x00;

  19. buff[3] = 0x04;

  20. buff[4] = 'M';

  21. buff[5] = 'Q';

  22. buff[6] = 'T';

  23. buff[7] = 'T';

  24. buff[8] = 0x04;//协议级别 Protocol Level

  25. buff[9] = 0 | (MQTT_StaCleanSession << 1) | (MQTT_StaWillFlag << 1)

  26.     | (MQTT_StaWillQoS << 3) | (MQTT_StaWillRetain << 5)

  27.     | (MQTT_StaPasswordFlag << 6) |(MQTT_StaUserNameFlag << 7);//连接标志

  28. buff[10] = MQTT_KeepAlive >> 8;

  29. buff[11] = MQTT_KeepAlive;

  30. len = strlen(MQTT_ClientIdentifier);

  31. buff[12] = len >> 8;

  32. buff[13] = len;

  33. msg = MQTT_ClientIdentifier;

  34. for(i = 0;i

  35. {

  36. buff[14+i] = msg[i];

  37. }

  38. lennum += len;

  39. if(MQTT_StaWillFlag)

  40. {

  41. len = strlen(MQTT_WillTopic);

  42. buff[13 + lennum + 1] = len >> 8;

  43. buff[13 + lennum + 2] = len;

  44. lennum += 2;

  45. msg = MQTT_WillTopic;

  46. for(i = 0;i

  47. {

  48. buff[14+lennum+i] = msg[i];

  49. }

  50. lennum += len;

  51. len = strlen(MQTT_WillMessage);

  52. buff[12] = len >> 8;

  53. buff[13] = len;

  54. lennum += 2;

  55. msg = MQTT_WillMessage;

  56. for(i = 0;i

  57. {

  58. buff[14+lennum+i] = msg[i];

  59. }

  60. lennum += len;

  61. }

  62. if(MQTT_StaUserNameFlag)

  63. {

  64. len = strlen(MQTT_UserName);

  65. buff[13 + lennum + 1] = len >> 8;

  66. buff[13 + lennum + 2] = len;

  67. lennum += 2;

  68. msg = MQTT_UserName;

  69. for(i = 0;i

  70. {

  71. buff[14+lennum+i] = msg[i];

  72. }

  73. lennum += len;

  74.  

  75. }

  76. if(MQTT_StaPasswordFlag)

  77. {

  78. len = strlen(MQTT_Password);

  79. buff[13 + lennum + 1] = len >> 8;

  80. buff[13 + lennum + 2] = len;

  81. lennum += 2;

  82. msg = MQTT_Password;

  83. for(i = 0;i

  84. {

  85. buff[14+lennum+i] = msg[i];

  86. }

  87. lennum += len;

  88. }

  89. buff[1] = 13 + lennum - 1;//最后计算长度

  90. }

4.3、订阅主题

订阅a/b时抓的包:

 
  1. /**********************

  2. 订阅主题的数据包

  3. Num:主题序号 (每次连接从1开始)

  4. RequestedQoS:服务质量要求0,1或2

  5. **********************/

  6. void GetDataSUBSCRIBE(unsigned char *buff,const char *dat,unsigned int Num,unsigned char RequestedQoS)

  7. {

  8. unsigned int i,len = 0,lennum = 0;

  9. buff[0] = 0x82;

  10. len = strlen(dat);

  11. buff[2] = Num>>8;

  12. buff[3] = Num;

  13. buff[4] = len>>8;

  14. buff[5] = len;

  15. for(i = 0;i

  16. {

  17. buff[6+i] = dat[i];

  18. }

  19. lennum = len;

  20. buff[6 + lennum ] = RequestedQoS;

  21. buff[1] = lennum + 5;

  22. }

4.4、发布信息

固定报头:

 

 

 

发送a/c主题信息为123时抓的包:

 

 

 
  1. /**************************************

  2. buff:数据包数组

  3. dup :重发标志

  4. qos :服务质量等级

  5. retain:保留标志

  6. topic:主题如“a/c”

  7. msg:消息

  8. ************************************/

  9. void GetDataPUBLISH(unsigned char *buff,unsigned char dup, unsigned char qos,unsigned char retain,const char *topic ,const char *msg)

  10. {   

  11.         unsigned int i,len=0,lennum=0;

  12. buff[0] = GetDataFixedHead(MQTT_TypePUBLISH,dup,qos,retain);

  13. len = strlen(topic);

  14. buff[2] = len>>8;

  15. buff[3] = len;

  16. for(i = 0;i

  17. {

  18. buff[4+i] = topic[i];

  19. }

  20. lennum = len;

  21. len = strlen(msg);

  22. for(i = 0;i

  23. {

  24. buff[4+i+lennum] = msg[i];

  25. }

  26. lennum += len;

  27. buff[1] = lennum + 2;

  28. }

4.5、心跳请求

客户端发送PINGREQ报文给服务端的。

用于:

    在没有任何其它控制报文从客户端发给服务的时,告知服务端客户端还活着。

    请求服务端发送 响应确认它还活着。

    使用网络以确认网络连接没有断开。

心跳请求抓的包:

可以看到就是发了一个C0 00

而服务器返回一个    d0 00

5、总结

    文中就讲了几个非常重要的请求格式。esp8266连接tcp服务器后就可以发送生成的数据包,就可以实现MQTT的功能。

    代码我已经测试过完全可用。

下面给完整的代码:

mqtt.h

 
  1. #ifndef __MQTT_H

  2. #define __MQTT_H

  3. #include "sys.h"

  4. #include

  5. #define MQTT_TypeCONNECT 1//请求连接

  6. #define MQTT_TypeCONNACK 2//请求应答

  7. #define MQTT_TypePUBLISH 3//发布消息

  8. #define MQTT_TypePUBACK 4//发布应答

  9. #define MQTT_TypePUBREC 5//发布已接收,保证传递1

  10. #define MQTT_TypePUBREL 6//发布释放,保证传递2

  11. #define MQTT_TypePUBCOMP 7//发布完成,保证传递3

  12. #define MQTT_TypeSUBSCRIBE 8//订阅请求

  13. #define MQTT_TypeSUBACK 9//订阅应答

  14. #define MQTT_TypeUNSUBSCRIBE 10//取消订阅

  15. #define MQTT_TypeUNSUBACK 11//取消订阅应答

  16. #define MQTT_TypePINGREQ 12//ping请求

  17. #define MQTT_TypePINGRESP 13//ping响应

  18. #define MQTT_TypeDISCONNECT 14//断开连接

  19.  

  20. #define MQTT_StaCleanSession 1 //清理会话

  21. #define MQTT_StaWillFlag 0 //遗嘱标志

  22. #define MQTT_StaWillQoS 0 //遗嘱QoS连接标志的第4和第3位。

  23. #define MQTT_StaWillRetain 0 //遗嘱保留

  24. #define MQTT_StaUserNameFlag 1 //用户名标志 User Name Flag

  25. #define MQTT_StaPasswordFlag 1 //密码标志 Password Flag

  26. #define MQTT_KeepAlive 60

  27. #define MQTT_ClientIdentifier "Tan1" //客户端标识符 Client Identifier

  28. #define MQTT_WillTopic "" //遗嘱主题 Will Topic

  29. #define MQTT_WillMessage "" //遗嘱消息 Will Message

  30. #define MQTT_UserName "admin" //用户名 User Name

  31. #define MQTT_Password "password" //密码 Password

  32.  

  33. unsigned char GetDataFixedHead(unsigned char MesType,unsigned char DupFlag,unsigned char QosLevel,unsigned char Retain);

  34. void GetDataPUBLISH(unsigned char *buff,unsigned char dup, unsigned char qos,unsigned char retain,const char *topic ,const char *msg);//获取发布消息的数据包

  35. void GetDataSUBSCRIBE(unsigned char *buff,const char *dat,unsigned int Num,unsigned char RequestedQoS);//订阅主题的数据包 Num:主题序号 RequestedQoS:服务质量要求0,1或2

  36. void GetDataDisConnet(unsigned char *buff);//获取断开连接的数据包

  37. void GetDataConnet(unsigned char *buff);//获取连接的数据包正确连接返回20 02 00 00

  38. void GetDataPINGREQ(unsigned char *buff);//心跳请求的数据包成功返回d0 00

  39. #endif

mqtt.c

 
  1. #include "mqtt.h"

  2.  

  3. unsigned char GetDataFixedHead(unsigned char MesType,unsigned char DupFlag,unsigned char QosLevel,unsigned char Retain)

  4. {

  5. unsigned char dat = 0;

  6. dat = (MesType & 0x0f) << 4;

  7. dat |= (DupFlag & 0x01) << 3;

  8. dat |= (QosLevel & 0x03) << 1;

  9. dat |= (Retain & 0x01);

  10. return dat;

  11. }

  12. void GetDataConnet(unsigned char *buff)//获取连接的数据包正确连接返回20 02 00 00

  13. {

  14. unsigned int i,len,lennum = 0;

  15. unsigned char *msg;

  16. buff[0] = GetDataFixedHead(MQTT_TypeCONNECT,0,0,0);

  17. buff[2] = 0x00;

  18. buff[3] = 0x04;

  19. buff[4] = 'M';

  20. buff[5] = 'Q';

  21. buff[6] = 'T';

  22. buff[7] = 'T';

  23. buff[8] = 0x04;//协议级别 Protocol Level

  24. buff[9] = 0 | (MQTT_StaCleanSession << 1) | (MQTT_StaWillFlag << 1)

  25. | (MQTT_StaWillQoS << 3) | (MQTT_StaWillRetain << 5)

  26. | (MQTT_StaPasswordFlag << 6) |(MQTT_StaUserNameFlag << 7);//连接标志

  27. buff[10] = MQTT_KeepAlive >> 8;

  28. buff[11] = MQTT_KeepAlive;

  29. len = strlen(MQTT_ClientIdentifier);

  30. buff[12] = len >> 8;

  31. buff[13] = len;

  32. msg = MQTT_ClientIdentifier;

  33. for(i = 0;i

  34. {

  35. buff[14+i] = msg[i];

  36. }

  37. lennum += len;

  38. if(MQTT_StaWillFlag)

  39. {

  40. len = strlen(MQTT_WillTopic);

  41. buff[13 + lennum + 1] = len >> 8;

  42. buff[13 + lennum + 2] = len;

  43. lennum += 2;

  44. msg = MQTT_WillTopic;

  45. for(i = 0;i

  46. {

  47. buff[14+lennum+i] = msg[i];

  48. }

  49. lennum += len;

  50. len = strlen(MQTT_WillMessage);

  51. buff[12] = len >> 8;

  52. buff[13] = len;

  53. lennum += 2;

  54. msg = MQTT_WillMessage;

  55. for(i = 0;i

  56. {

  57. buff[14+lennum+i] = msg[i];

  58. }

  59. lennum += len;

  60. }

  61. if(MQTT_StaUserNameFlag)

  62. {

  63. len = strlen(MQTT_UserName);

  64. buff[13 + lennum + 1] = len >> 8;

  65. buff[13 + lennum + 2] = len;

  66. lennum += 2;

  67. msg = MQTT_UserName;

  68. for(i = 0;i

  69. {

  70. buff[14+lennum+i] = msg[i];

  71. }

  72. lennum += len;

  73.  

  74. }

  75. if(MQTT_StaPasswordFlag)

  76. {

  77. len = strlen(MQTT_Password);

  78. buff[13 + lennum + 1] = len >> 8;

  79. buff[13 + lennum + 2] = len;

  80. lennum += 2;

  81. msg = MQTT_Password;

  82. for(i = 0;i

  83. {

  84. buff[14+lennum+i] = msg[i];

  85. }

  86. lennum += len;

  87. }

  88. buff[1] = 13 + lennum - 1;

  89. }

  90. void GetDataDisConnet(unsigned char *buff)//获取断开连接的数据包

  91. {

  92. buff[0] = 0xe0;

  93. buff[1] = 0;

  94. }

  95. void GetDataPINGREQ(unsigned char *buff)//心跳请求的数据包成功返回d0 00

推荐阅读

史海拾趣

HARTING公司的发展小趣事

Hanghsing Enterprise Co., Ltd. 的五个发展故事

故事一:初创与起步

Hanghsing Enterprise Co., Ltd.(以下简称“Hanghsing”)成立于台湾,起初是一家专注于精密零部件制造的小型公司。公司位于No. 1, Lane 39, Seuwe St., Tali City, Taichung Hsien, Taiwan 412,凭借对品质的不懈追求和对市场的敏锐洞察,Hanghsing逐渐在行业内崭露头角。公司初期主要生产Valve Shafts、Nuts、Screws等精密不锈钢部件,这些产品广泛应用于电子、机械等多个领域。通过不断优化生产工艺和质量控制体系,Hanghsing逐渐建立了良好的市场口碑。

故事二:技术突破与产品升级

随着电子行业的快速发展,Hanghsing意识到技术创新的重要性。公司加大了对研发的投入,引进了一批高素质的技术人才,致力于新产品的开发和现有产品的升级。经过不懈努力,Hanghsing成功推出了一系列高精度、高可靠性的电子产品零部件,如Sleeve Barrels、Toggles和Mandrels等。这些产品不仅满足了市场对高品质零部件的需求,还进一步巩固了公司在电子行业供应链中的地位。

故事三:市场拓展与国际合作

随着产品质量的不断提升和市场份额的逐步扩大,Hanghsing开始将目光投向国际市场。公司积极参加各类国际展会,与全球知名电子企业建立合作关系,将产品销往世界各地。同时,Hanghsing还注重与国际技术标准的接轨,确保产品符合国际市场的严格要求。通过不断的市场拓展和国际合作,Hanghsing在国际上的知名度和影响力得到了显著提升。

故事四:产业升级与多元化发展

面对电子行业的快速发展和市场竞争的日益激烈,Hanghsing积极寻求产业升级和多元化发展的路径。公司开始涉足电子元器件的制造和研发领域,通过引进先进的生产设备和工艺技术,不断提升产品的附加值和市场竞争力。同时,Hanghsing还积极拓展上下游产业链,与原材料供应商和终端客户建立紧密的合作关系,形成了完整的产业生态体系。

故事五:绿色生产与可持续发展

在追求经济效益的同时,Hanghsing始终不忘履行社会责任。公司积极响应国家环保政策,致力于绿色生产和可持续发展。通过引进环保设备和工艺技术,减少生产过程中的污染物排放和资源消耗。同时,Hanghsing还加强了对员工的环保教育和培训,提高员工的环保意识和责任感。这些举措不仅有助于提升公司的社会形象和市场竞争力,还为推动电子行业的绿色发展做出了积极贡献。

Hamamatsu公司的发展小趣事

Habia Cable公司电子行业发展的五个故事

故事一:聚四氟乙烯的先驱

Habia Cable的故事始于1941年,由Carl Herbert Jacobsson在瑞典斯德哥尔摩创立。起初,公司是一家聚合物制造商,专注于胶木部件的生产。然而,Jacobsson的远见卓识使Habia成为欧洲首批使用聚四氟乙烯(PTFE)的公司之一,并在1946年在美国推出了第一款商业聚四氟乙烯产品。这一创新不仅为Habia奠定了技术基础,也使其迅速在电线电缆领域崭露头角。随着时间的推移,Habia成为最早制造聚四氟乙烯电线和电缆的公司之一,这一技术突破为公司后续的发展奠定了坚实的基础。

故事二:国际扩张的征程

自1957年Habia制造其第一条电缆以来,公司便踏上了国际扩张的征途。1969年,Habia在荷兰布雷达开设了其第一家国际销售办公室,这标志着公司正式进入全球市场。随后,Habia在70年代至80年代经历了迅速的国际扩张,工厂和销售办事处相继在法国、德国、英国、西班牙、比利时和美国等地成立或收购。这一时期的快速扩展不仅增强了Habia在全球范围内的市场竞争力,也为其后续的发展积累了宝贵的经验和资源。

故事三:技术创新的引领

Habia Cable一直以来都是技术创新的引领者。在2000年,公司收购了德国Norderstedt的高温电线和电缆制造商Isotec Kabel GmbH,这一举措使德国成为Habia最大的市场,并为其在欧洲的进一步发展提供了强有力的支持。此外,Habia Cable还不断投资于新技术和新设备的研发,以满足市场对高性能电缆和线束的需求。例如,在2016年,Habia Cable投资独特设备制造含氟聚合物电线和电缆的长截面和大截面产品,以满足离岸部门等苛刻应用的需求。

故事四:亚洲市场的布局

随着全球化进程的加速,Habia Cable也开始将目光投向亚洲市场。2000年,Habia Cable在中国常州设立工厂,生产同轴电缆,这标志着公司正式进入亚洲市场。此后,Habia在亚洲的扩张步伐不断加快,不仅在中国建立了多个生产基地,还在韩国、香港和日本等地设立了销售办事处。这些举措不仅提升了Habia在亚洲市场的知名度,也为其在全球范围内的业务增长提供了新的动力。

故事五:定制解决方案的提供

Habia Cable一直致力于为客户提供定制化的解决方案。公司拥有一支知识渊博的销售团队和设计工程师团队,他们能够与客户紧密合作,根据客户的独特需求开发满足其要求的电缆和线束产品。Habia Cable的制造灵活性、低订单数量要求和短交货周期等特点使其在市场上具有很强的竞争力。无论是电信、核电、国防还是海洋和工业领域,Habia Cable都能为客户提供高质量、高性能的电缆和线束产品,满足其苛刻的应用需求。

Display Engineering Services公司的发展小趣事

以下是五个电子行业里Display Engineering Services公司发展起来的相关故事:

故事一:
在科技日新月异的今天,XX公司凭借其在Display Engineering Services领域的专业技术和创新能力,逐渐崭露头角。起初,XX公司只是一家专注于显示屏研发的小型技术公司,但在市场需求的驱动下,公司意识到为客户提供定制化的显示屏解决方案具有巨大潜力。于是,XX公司开始将重心转移到Display Engineering Services上,通过深入了解客户需求,提供从设计、制造到安装的全流程服务。经过数年的努力,XX公司不仅积累了丰富的经验,还建立起一支专业的技术团队,赢得了业界的广泛认可。

故事二:
YY公司的发展历程颇具传奇色彩。该公司最初只是一家为电子产品提供显示屏配件的供应商。然而,随着市场竞争的加剧,YY公司意识到单纯提供配件已无法满足客户需求。于是,公司决定转型为Display Engineering Services提供商,致力于为客户提供显示屏的定制设计和优化服务。YY公司凭借其卓越的技术实力和敏锐的市场洞察力,成功转型,并在短时间内实现了业务的快速增长。如今,YY公司已成为行业内的佼佼者,其显示屏解决方案广泛应用于各个领域。

故事三:
ZZ公司是一家专注于Display Engineering Services的创业公司。在创立之初,公司面临着资金短缺、技术瓶颈等诸多困难。然而,创始人凭借对技术的热爱和对市场的敏锐洞察,带领团队攻克了一个又一个技术难题。同时,ZZ公司还积极寻求外部合作,与多家知名企业建立了紧密的合作关系,共同开发具有市场竞争力的显示屏产品。在团队成员的共同努力下,ZZ公司逐渐在Display Engineering Services领域崭露头角,成为了一家备受瞩目的创新型企业。

故事四:
AA公司的发展历程充满了挑战与机遇。在成立初期,公司面临着激烈的市场竞争和不断变化的客户需求。为了应对这些挑战,AA公司决定加大研发投入,不断提升自身的技术实力。同时,公司还积极拓展国际市场,与全球多家知名企业建立了合作关系。通过不断的技术创新和市场拓展,AA公司逐渐在Display Engineering Services领域树立了良好的品牌形象,赢得了客户的信赖和支持。

故事五:
BB公司是一家历史悠久的Display Engineering Services企业。多年来,公司始终坚持以客户需求为导向,不断提升服务质量和技术水平。为了保持竞争优势,BB公司不断引进先进的生产设备和技术人才,加强内部管理和质量控制。同时,公司还积极参与行业交流和合作,与国内外多家知名企业建立了良好的合作关系。在多年的发展中,BB公司积累了丰富的经验和技术优势,成为了行业内的领军企业之一。其显示屏解决方案广泛应用于各个领域,并获得了多项国内外技术专利和荣誉。

Dae Ryung Electronic Co Ltd公司的发展小趣事

在追求经济效益的同时,Dae Ryung Electronic Co Ltd公司也积极履行社会责任并推动可持续发展。公司注重环保和节能减排工作,在生产过程中采用环保材料和工艺减少污染排放。同时,公司还积极参与社会公益事业和慈善活动回馈社会。这些做法不仅提升了公司的社会形象也促进了企业与社会的和谐发展。

Cermetek Microelectronics公司的发展小趣事

Cermetek Microelectronics公司在创立之初,便专注于微电子技术的研发与创新。创始人凭借在半导体领域的深厚背景,带领团队攻克了一系列技术难题,成功开发出具有高性能和稳定性的微电子产品。这些产品不仅满足了市场对微型化、高集成度的需求,更在多个关键领域实现了技术突破,为公司赢得了市场的初步认可。

C-MAX Time Solutions公司的发展小趣事

C-MAX Time Solutions公司在发展过程中,逐渐认识到深耕细分市场的重要性。公司针对工业控制、安防监控等特定领域,推出了定制化的时间同步解决方案。这些方案不仅满足了客户的特殊需求,也提高了C-MAX在这些细分市场的占有率。通过不断积累口碑和经验,C-MAX逐渐在电子行业中树立起了专业、可靠的形象。

问答坊 | AI 解惑

搅浑税控这潭

中国的税控机市场究竟有多大?日前在北京召开的税控机产业链论坛上,中国信息产业商会税控信息化设备分会秘书长郑志光爆料,在未来的5年内,国内税控收款机的市场规模在100亿元左右。这与此前业界和研究机构盛传的2000亿元的市场份额相去甚远。一下 ...…

查看全部问答>

低成本1A线性锂电池充电器芯片方案(CN3056)

概述: CN3056是可以对单节锂离子或者锂-聚合物可充电电池进行恒流/恒压充电的充电器电路.该器件内部包括功率晶体管,应用时不需要外部的电流 检测电阻和阻流二极管.CN3056只需要极少的外围元器件,并且符合USB总线技术规范,非常适用于便携式应 ...…

查看全部问答>

文件不是有效windows CE安装文件

我是用C#进行开发的,直接部署到设备上运行没有问题,但是生成cab安装文件,在设备上安装失败,提示“文件不是有效windows CE安装文件”。系统是wince 5.0…

查看全部问答>

介绍下关于windows mobile6 api的书籍

介绍下关于windows mobile6 api的书籍,谢谢…

查看全部问答>

WINDOWS MOBILE下导航软件(具备源代码)。

WINDOWS MOBILE下导航软件(具备源代码)。 开发平台:EVC4.0 使用平台:WINDOWS MOBILE5,6 电子地图格式:MM4 地图转换工具:MAPINFO格式转到MM4(具备源代码)。 该软件是为台湾使用编写的,在大陆还没有版本问题。 现带全套代码,寻求合作 ...…

查看全部问答>

uclinux扫盲贴

uclinux表示micro-control linux.即“微控制器领域中的Linux系统”,是Lineo公司的主打产品,同时也是开放源码的嵌入式Linux的典范之作。uCLinux主要是针对目标处理器没有存储管理单元MMU(Memory Management Unit)的嵌入式系统而设计的。它已经被 ...…

查看全部问答>

两个VHDL写的51单片机内核

VHDL语言进行MCS-51兼容单片机ip核开发,给各位坛友见识一下我收藏的资料, [ 本帖最后由 awarenessxie 于 2012-9-3 21:32 编辑 ]…

查看全部问答>

贴一颗“纽扣”,装一个App,东西就不怕丢了

CES 大会上又有好玩意儿了。它是 StickNFind 公司推出的一个纽扣形状的追踪器,可以贴到任何物体上,通过蓝牙和手机上的一个 App 通信(iOS 和 Android 版均有),能给丢三落四的同学省去不少苦恼。这个 App 和这颗纽扣的通信有一个要求,就是在 ...…

查看全部问答>

我发现美国大片里好多创意很不错

大家发现没有,美国大片里的好多科幻的玩意儿,都会在几年内实现,比如那个普罗米修斯里的测绘山洞的飞行仪器,其实我感觉就可以用四轴飞行器,加高精度360度激光,应该就能实现。 还有猜测梦境的东西,不是那个小日本已经能实现一部分了吗?好神 ...…

查看全部问答>

我来评论,太阳能光伏发电解决方案

对ADI的产品还算是比较了解的,之前用过他的DDS类的芯片,这个感觉不错,另外就是用过AD,DA,以及一个很快的比较器ADCMP600系列的,刚才太阳能伏光里面提到的有AD7606那个多通道的数模转换也很给力,ADI的前景很大,真的,就是芯片贵了点,另外指标 ...…

查看全部问答>