精华内容
下载资源
问答
  • 本文主要探讨的是怎样快速实现基于物联网技术的共享停车的联网方案分析。 想要能够快速搭建其方案原型,可选择采用shineblink.com推出的Core开发板,该开发板作为专用的物联网开发板,其编程简单且功能强大。 PS...

    一、前言

    本文主要探讨的是怎样快速实现基于物联网技术的共享停车位的联网方案分析。

    想要能够快速搭建其方案原型,可选择采用shineblink.com推出的Core开发板,该开发板作为专用的物联网开发板,其编程简单且功能强大。
    PS:Core 仅用五、六行代码即可实现Wifi/Ble/NB/Lora/ThreadMesh/RFID/Eth/Usb/RS485/RS232通信、以及30多种传感器/10多种硬件外设/10多种Mcu内设功能,并且这些功能最多可以 5 种随机组合同时运行。更多关于Core的内容可以在 shineblink.com 上了解。

    二、共享车位方案设计思路

    此方案采用mesh无线组网技术,Lora无线远距离强穿透技术,NBIOT无线远程通信技术,下面解释为什么会用这三种无线技术。
    Mesh网络:每个车位采用Mesh节点组网的方式。因为Mesh节点有成本低,数量大的优点。
    Lora星型网络:Lora负责把各个Mesh网络串联起来,因为Lora通信距离很远,且穿墙性能优越。适合地下多层停车场的通信布局。
    NBIOT通信:NBIOT通信模块负责和远程的云端通信。一般整个停车场用一到2个即可。

    在这里插入图片描述

    三、具体程序

    一、Mesh组网代码

    --PanID和Channel决定了mesh网络的唯一性
    PanID = 0x1234 --16位整型
    Channel = 11 --选择范围(11~26)
    MyRole = "Client" --一个mesh网络里可以有多个client角色
    LIB_MeshConfig(MyRole,PanID,Channel) --启动并加入mesh网络
    --client自身的名字"CONTROL0"和server端所提及到的client名字要一致
    ClientName = "CONTROL0" --ClientName是Client在网络中被Server所识别的唯一身份ID
    LIB_GpioOutputConfig("D8","STANDARD") --LED1
    LIB_GpioOutputConfig("D9","STANDARD") --LED2
    LIB_GpioWrite("D8",1) --LIB_GpioWrite("D9",1) ----设置按键1(占用D0口,低电平有效)
    LIB_ButtonConfig("BTN1","D10","L")
    net_state = 0--开始大循环
    while(GC(1) == true)
    do
        --网络状态led指示
        net_state = LIB_MeshClientNetStateQuery()
        if net_state == 2 then --client已加入mesh网且找到了server
            LIB_GpioWrite("D9",0) --LED2亮
        else
            LIB_GpioWrite("D9",1) --LED2灭
        end
        --如果BTN1按键短按且client已经加入mesh网并找到了server,就向Server上传数据
        key = LIB_ButtonQuery("BTN1")
        if key == 1 and net_state == 2 then
            data = {0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00} 
            LIB_MeshClientSendData(ClientName,data)
        end
        --查询是否收到来自server下发的8字节命令,并解析
        recv_flag, cmd = LIB_MeshClientRecvCommand()
        if recv_flag == 1 and #cmd == 8 then
            if cmd[1] == 0x10 then --这里只解析server下发的命令的第一个字节
                LIB_GpioToggle("D8") --LED1亮或灭切换
            end
        end
    end
    

    二、Lora代码

    --本机地址(范围:0-65535),其他Lora节点如果需要发送消息给本机必须知道该地址
    addr = 100 
    --通信信道(范围:410-441MHz),相互通信的Lora节点必须在同一信道
    channel = 433
    --无线速率(范围:0.3, 1.2, 4.8, 9.6, 19.2kpbs),速率越低通信质量越高
    baudrate = "9.6kpbs"
    --发射功率(范围:11, 14, 17, 20dB),该值越大通信质量越高,但功耗会增加
    tx_pwr = "20dB"--设置Lora模块占用TX0、RX0、Aux接D5引脚,Md0接D6引脚
    --Lora通信参数:地址=100,通信信道=433M,无线速率=9.6kbps,发射功率=20dBm
    LIB_LoraConfig("UART0","D5","D6",addr,channel,baudrate,tx_pwr)--开始大循环
    while(GC(1) == true)
    do
        --查询是否收到数据,如果收到就应答
        recv_flag,recv_addr,recv_data = LIB_LoraRecv()
        if recv_flag == 1 then
            --将收到的数据全部加1作为应答返回给发送者
            for i = 1, #recv_data, 1 do 
                recv_data[i] = recv_data[i] + 1
            end
            LIB_LoraSend(recv_addr, recv_data)
        end
    end
    

    三、NBIOT连接云端代码

    --MQTT服务器地址(适用于ONE NET平台)
    server_addr = "183.230.40.96" --中移物联网MQTT接入服务ip地址
    server_port = 1883--MQTT 连接参数(适用于ONE NET平台)
    mqtt_con_clientID = "TestDevice001"
    mqtt_con_username = "353255"
    mqtt_con_password = "version=2018-10-31&res=products%2F353255%2Fdevices%2FTestDevice001&et=1893427200&method=md5&sign=%2F5RJwGwytPWvVDB04K7rnw%3D%3D"--MQTT topic相关参数(适用于ONE NET平台)
    mqtt_sub_topic = "$sys/353255/TestDevice001/cmd/request/+"--订阅用
    mqtt_pub_topic = "$sys/353255/TestDevice001/dp/post/json" --发布用
    ​
    --设置m5311 NB模块占用TX0、RX0、D5、D6引脚,MQTT模式
    --KeepAlive周期180LIB_NbMqttM5311Config("UART0","D5","HIGH","D6","HIGH",server_addr,server_port,mqtt_con_clientID,mqtt_con_username,mqtt_con_password,180,mqtt_sub_topic,"QOS0")--配置D9为普通输出,控制LED2
    LIB_GpioOutputConfig("D9","STANDARD")
    --使能系统10毫秒定时器开始工作
    LIB_10msTimerConfig("ENABLE")
    --设置sht3x传感器占用SCL0和SDA0引脚,以每秒出10个数据的频率工作,"HIGH"表示最高精度
    LIB_Sht3xConfig("IIC0","10","HIGH")--变量初始化
    cnt_10ms = 0
    cnt1_10ms = 0
    pub_id = 0
    temprature = 0.00
    humidity = 0.00--定义10ms中断回调函数
    function LIB_10msTimerCallback()
        cnt_10ms = cnt_10ms + 1
        cnt1_10ms = cnt1_10ms + 1
    end
    ​
    --开始大循环
    while(GC(1) == true)
    do
        sht3x_flag,temp,humi = LIB_Sht3xGetResult()
        --如果传感器有新的温湿度数据产生
        if sht3x_flag == 1 then
            temprature = temp
            humidity = humi
        end
    ​
        --查询是否收到服务器下发的cmd数据(已订阅的"$sys/353255/TestDevice001/cmd/request/+")
        recv_flag,topic,data = LIB_NbMqttM5311RecvSub()
        if recv_flag == 1 then
            --根据json路径"$.LED"解析服务器下发的json文本,并执行LED亮灭操作
            Json_Val = LIB_JsonParse(data, "$.LED")
            --服务器下发的是"{"LED":0}"
            if Json_Val == "0" then
                LIB_GpioWrite("D9",1) --LED2灭
            --服务器下发的是"{"LED":1}"
            elseif Json_Val == "1" then
                LIB_GpioWrite("D9",0) --LED2亮
            --服务器下发的是"{"LED":2}"
            elseif Json_Val == "2" then
                LIB_GpioToggle("D9") --LED2亮灭切换
            else 
                LIB_GpioWrite("D9",1) --LED2灭
            end
            --根据收到的topic中的cmdid应答服务器,
            --将收到的topic中"request"替换成"response"后作为应答topic发给服务器
            topic = string.gsub(topic,"request","response") 
            --应答内容可自定义,这里为"Got it!"
            LIB_NbMqttM5311SendPub("QOS0", topic, "Got it!")
        end
    ​
        --5秒发送温湿度度数据给server
        if cnt_10ms >= 500 then
            cnt_10ms = 0
            pub_id = pub_id + 1
            json_str = string.format("{\"id\":%d, \"dp\":{\"temperatrue\":[{\"v\": %.2f,}], \"humidity\":[{\"v\":%.2f,}]}}", pub_id, temprature, humidity)
            --注意json_str的总长度不要超过150字节
            LIB_NbMqttM5311SendPub("QOS0", mqtt_pub_topic, json_str) --publish
        end
        
        --12秒打印一次NBIOT模组信息(包含sim卡)
        --注意:这里只是为了演示如何获取模组信息,实际应用中您可以根据您的需求查询即可,不需要一直查询
        if cnt1_10ms >= 1200 then  --12000ms
            cnt1_10ms = 0
            State,IMEI,IMSI,ICCID,RSSI = LIB_NbStatusQuery()
            print(string.format("module state: %s", State))
            print(string.format("module IMEI: %s", IMEI))
            print(string.format("module IMSI: %s", IMSI))
            print(string.format("module ICCID: %s", ICCID))
            print(string.format("module RSSI: %d dBM", RSSI))
        end
    end
    

    **以上程序为官网部分例程,需要进行相应的改动。

    四、结语

    通过ShineBllink Core物联网开发板,可以快速搭建相应的物联网共享停车位解决方案,此方案能够轻松解决,在一些地下停车场等信号不好的情况。

    展开全文
  • 怎样创建和读写共享内存?

    千次阅读 2009-02-19 18:06:00
    --------------------------------------------------------------- 在16Windows中,有好几种方法可以共享数据。可能最普通的方法是使用属于另一个进程的窗口来调用SendMessage或者PostMessage。在16Windows中...

     

    读写的时候怎样锁定?

    --------------------------------------------------------------- 16Windows中,有好几种方法可以共享数据。可能最普通的方法是使用属于另一个进程的窗口来调用SendMessage或者PostMessage。在16Windows中,这样只能传递一个16位值和一个32位值,。也可以使用GMEM_SHARE标志来分配一块全局内存,再调用SendMessage或者PostMessage来传送(作为参数wParamlParam)。消息的接收者再调用GlobalLock来得到内存块的地址,然后可以读写数据。

     

    Win32中,每个进程有自己的地址空间,一个进程不能轻易地访问另一个进程地址空间中的数据,所以不能像16Windows那样做。Win32系统允许多个进程(运行在同一计算机上)使用内存映射文件来共享数据。实际上,其他共享和传送数据的技术,诸如使用SendMessage或者PostMessage,都在内部使用了内存映射文件。

     

    这种数据共享是让两个或多个进程映射同一文件映射对象的视图,即它们在共享同一物理存储页。这样,当一个进程向内存映射文件的一个视图写入数据时,其他的进程立即在自己的视图中看到变化。但要注意,对文件映射对象要使用同一名字。

     

    以下是一种解决方法的代码:

    创建:

    HANDLE s_hFileMap = CreateFileMapping((HANDLE)0XFFFFFFFF,NULL,PAGE_READWRITE, 0, 4*1024_TEXT("MyCustShareData"));

    (此函数寻找一个名字为"MyCustShareData"的内存映射文件,不存在则创建,存在则返回已有的句柄,所以当返回值不为空的话,还须检查GetLastError,如果得到ERROR_ALREADY_EXISTS,则表明该名字的内存映射文件已经存在,并未创建成功)

     

    读写:

    HANDLE hFile = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, _TEXT("MyCustShareData"));//最后一个参数为名字,必须与创建的相同

    if(hFile != NULL)

    {

        LPVOID lpView =  MapViewOfFile(hFile, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);//将内存映射文件的一个视图映射到当前的地址空间

        if ((int *)lpView != NULL) 

        {

    int sheardata = (int*)lpview; //

             (int *)lpview = 88; //

        }

        UpmapViewOfFile((LPVOID) lpview);

    }

    CloseHandle(hFile);

    展开全文
  • 由于共享内存不能使用指针,因此犯难了 哪大神对boost offset_ptr比较了解的, 怎样把boost offset_ptr 指向一个字符串
  • 如果您要加密的是十分机密的文件,强烈建议您使用“最高的加密强度”,它使用了256BlowFish及AES加密算法,安全至上! 5. 隐藏锁定加密方式安全吗? 软件使用了三种方法加密文件,可以有效阻止入侵者(即使在内核...
  • 那么当我们需要在进程间共享数据时,怎样做才能快捷方便地实现呢?在32应用系统中,每个应用程序会将DLL映射到自己的地址空间,同时DLL中的数据也就随之被映射了。这样,每个应用程序都有自己的数据实例,在一个...

      DLL是创建Windows应用程序,实现代码重用的重要手段。那么当我们需要在进程间共享数据时,怎样做才能快捷方便地实现呢?在32位应用系统中,每个应用程序会将DLL映射到自己的地址空间,同时DLL中的数据也就随之被映射了。这样,每个应用程序都有自己的数据实例,在一个应用程序中修改DLL中的全局变量,不会影响其它的应用程序。DLL的使用似乎与我们的目的相背离,那么如何才能实现我们想要的东东呢?这里给大家介绍一种特殊的技术,那就是内存映射文件。

      内存映射文件提供了一种方法,就是在WIN32系统的地址空间保留一块内存区域,物理存储可以向其中提交。并且内存映射文件不只是磁盘文件,也可以是WIN32的页面文件,而且后者比前者要好,因为这意味着可以像访问一个磁盘文件那样访问内存中的一个区域,而不用创建临时文件,用完后还得删除它。WIN32有自己的管理页面调度文件,当不需要页面调度文件时,系统会自动将有关区域释放。以下是具体的实现代码:

      library Project1;
    uses
    shareMem,
    windows,
    SysUtils,
    Classes;
    const
     MFileName: Pchar = ’ShareData’;
     //定义一个记录类型,你所需要共享的数据就保存在这里。
     //当在进程中调用GetDllData时,进程中也应该定义一个与这个一样的记录类型。
    type
     PGlobalDllData = ^TGlobalDllData;
     TGlobalDllData = record
     s: string[50];
     i: integer;
    end;
    var
     GlobalData: PGlobalDllData; //这是一个全局变量,指向创建的内存映射文件。
     MapHandle: THandle;
     //给外部进程调用的过程,当外部进程调用这个过程后,形参AGlobalData就指向了我//们创建的内存映射文件. 我们可以创建两个进程, 同时调用这个过程, 那么在其中一个进 //程中修改数据后, 在另外一个进程中既可反应出来, 实现了我们需要的共享.
    procedure GetDllData(var AGlobalData: PGlobalDllData);stdcall; begin
     AGlobalData := GlobalData;
    end;
    procedure OpenThisData;
    var
     size: integer;
    begin
     size := sizeof(TGlobalDllData);
     //创建一个内存文件映射对象,MfileName保存的值就是该对象的名字。
     mapHandle := CreateFileMapping(Dword(-1), nil, page_readWrite, 0, size, MFileName);
     if mapHandle = 0 then
      RaiseLastWin32Error;
      //把文件的视图映射到调用进程的地址空间,该函数的返回值就是该对象的首地址。注//意,这是调用进程的地址,两个应用程序调用该DLL,返回值是不一样的。
     GlobalData := MapViewOfFile(mapHandle, File_map_all_Access, 0, 0, size);
     Globaldata^.s := ’TEST’;
     GlobalData^.i := 5;
     if GlobalData = nil then
     begin
      CloseHandle(MapHandle);
      RaiseLastWin32Error;
     end;
    end;
    //DLL从进程中分离出来时,应该释放相应的空间
    procedure CloseThisData;
    begin
     unmapViewOfFile(GlobalData);
     closeHandle(MapHandle);
    end;
    procedure DllEntryPoint(dwReason: DWord);
    begin
     case dwReason of
      Dll_Process_Attach: OpenThisData; //调用DLL时传入的参数,由系统自动传入
      Dll_Process_Detach: CloseThisData; //释放DLL时传入的参数,系统自动传入。
     end;
    end;
    {$R *.res}
    exports
     GetDllData; //外部应用程序调用的就是这个过程。
     
    begin
     DllProc := @DllEntryPoint; //该变量是一个全局变量,由它来指定DLL的入口及出 //口函数。
     DllEntryPoint(Dll_Process_Attach);
    end.
    //以上代码在DELPHI6中编译通过。
     

    转载于:https://www.cnblogs.com/zhaoshujie/archive/2008/10/03/9594840.html

    展开全文
  • 可能较少人知道在Win10系统中的Web服务器是什么吧,其功能就是在局域网中能够进行资源共享,以便Win10使用者时刻都能将个人数据传达服务器端中,快速执行数据的同步。应该怎样搭建Web服务器呢?今天就将为给解决Web...

    Web服务器怎样搭建 解析在Win10系统中搭建Web的方法     

    可能较少人知道在Win10系统中的Web服务器是什么吧,其功能就是在局域网中能够进行资源共享,以便Win10使用者时刻都能将个人数据传达服务器端中,快速执行数据的同步。应该怎样搭建Web服务器呢?今天就将为给位解决Web服务器怎样搭建 解析在Win10系统中搭建Web的方法分享,请看如下:

      1、点击“开始——控制面板—— 程序”选项,在弹出的窗口点击左侧“打开或关闭Windows服务”键值。

      2、在出现的菜单中点选“Internet信息服务”项下方的全部项目,点选“确定”键值。

      3、进行更新服务。

      4、更新成功后就开启浏览器,键入“http://localhost/”按回车键,若是此时显示出IIS7欢迎面板,表明Web服务器就已成功搭建。

      5、当web服务器成功搭建后,将开发的网站装载到Web服务器的选项中。通常当Web服务器成功装载后,都会建立路径“%系统根目录%inetpub/wwwroot”,把已开发的网站拷贝至此路径里便可执行本地访问那个网站了。

      6、然后设定防火墙,使局域网的别的电脑也可以访问本地网站资源。步骤是:点“开始——控制面板——系统和安全——允许程序通过Windows防火墙”等键值,在出现的窗口中的“万维网服务HTTP”前面以及右侧两框都打上“√”,再点“确定”保存。

      7、如此设置后在局域网中别台电脑的使用者,开启浏览器键入“http://Web服务器的IP地址/”点确定后便可访问共享web服务器上的资源了。

    展开全文
  • 摘要创建一个 2048 RSA 公钥/私钥对。生成一个嵌入您的公钥的证书签名请求 (CSR)将 CSR 与证书颁发机构 (CA) 共享以接收最终证书或证书链。将最终证书安装在非网络可访问的位置,例如 /etc/ssl(Linux 和 Unix)...
  • 独立IP和共享IP、网络地址转换NAT

    千次阅读 2015-12-19 21:34:46
    独立IP和共享IP: 我们在购买虚拟主机的时候经常看到“独立IP”这个词。那究竟什么是“独立IP”,它的原理是怎样的? IP地址是由32(bit)字组成,分成4组,每组为0-255之间的数字,比如说:192.168.0.123...
  • SQL Server 使用两个内部数据结构跟踪被大容量复制操作修改的区,...与全局分配图 (GAM) 和共享全局分配图 (SGAM) 页相同,这些结构也是位图,其中的每一代表一个单独的区。 差异更改映射表 (DCM) 这样便可以
  • word使用技巧大全

    热门讨论 2011-03-18 20:37:53
    26、Excel单元格多于15数字的输入 87 27、Word中磅与厘米的换算 87 28、计算机中容量单位的换算 88 29、在Excel中复制上一单元格 88 30、清除拼写功能 88 31、Word表格后空白页的处理 88 32、改变图片形状 88 33、...
  • 感觉好像没有《高等应用数学问题的MATLAB求解》这本书的资料,只有一为朋友上传的答案,所以呢,就上传一下,不过是PPT的,没有搜到PDF格式的,那朋友有的话,麻烦也上传一下,大家一起共享嘛!oo... 附两张图,...
  • 非常感谢CSDN网友Genius125(genius.net) ...gt;选项->安全:第四个复选框勾上即可原来,MP10默认的安全级别高了...不敢独享,写下来让所有有此困惑的朋友们共享另外,也顺便帮这朋友问一下:怎样在MP10中播放F...
  • Server 的安装、操作和使用,展示了Windows 2000 Server 的新功能,从而揭示出该操作系统的稳定性 和可靠性,以及它给服务器管理所带来的极大方便。 本书内容充实,编排有序,是Windows NT 系统 管理员、...
  • 我也试着建了个共享文件夹,通过资源管理器删除后,也在回收站无法找到,这样也算理解那女汉子的苦衷了。 我们平时使用PowerShell的Remove-Item命令删除了文件,也是属于彻底删除。其实说真的,如果可以,我很想对...
  • 网上看到一仁兄的这篇文章,写的很不错,摘抄下来备不时之需。... 名词解释 App:Application VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存) RSS - Resident Set Size 实际使用物理内存(...
  • 12.3 怎样使用/proc文件系统 12.4 seq file 12.5 proc文件系统的内部实现机制 12.6 实验一:使用proc文件系统的一个简单例子 12.7 实验二:利用/proc文件系统显示缺页状态 12.8 实验三:seq file使用例子 第13章 ...
  • 12.2.3 怎样使用一种独特的顺序对数据项进行排序,它既不是增序也不是降序 282 12.2.4 怎样将数据透视表转换为硬数据 283 12.2.5 有简单的方法填充行字段留下的空单元格吗 283 12.2.6 简单的方法填充许多列...
  • 12.2.3 怎样使用一种独特的顺序对数据项进行排序,它既不是增序也不是降序 282 12.2.4 怎样将数据透视表转换为硬数据 283 12.2.5 有简单的方法填充行字段留下的空单元格吗 283 12.2.6 简单的方法填充许多列...
  • 12.2.3 怎样使用一种独特的顺序对数据项进行排序,它既不是增序也不是降序 282 12.2.4 怎样将数据透视表转换为硬数据 283 12.2.5 有简单的方法填充行字段留下的空单元格吗 283 12.2.6 简单的方法填充许多列...
  • 12.2.3 怎样使用一种独特的顺序对数据项进行排序,它既不是增序也不是降序 282 12.2.4 怎样将数据透视表转换为硬数据 283 12.2.5 有简单的方法填充行字段留下的空单元格吗 283 12.2.6 简单的方法填充许多列...
  • Windows内存体系结构

    2012-03-28 21:32:00
    能够使你知道怎么在两个进程之间共享数据、系统在哪里存放了我们的数据以及怎样编写更高效的应用程序。  在32的Windows系统中,每一个进程有4G的虚拟地址空间,之所以说是虚拟的,因为4G只是一个地址空间,一个...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 125
精华内容 50
关键字:

怎样使用共享位