用户友好型博客

Userful如何帮助企业整合热像仪 | 第二部分

作者:Userful| 2020年5月29日 6:00:00 AM

在本博客的第一部分中,我们描述了红外热像仪和其他新技术将如何在后COVID时代成为第二天性。在这一部分中,我们将展示一个设置实例。

我们使用了一个视频管理服务器(VMS),其软件平台可与数百个不同供应商的摄像机集成,包括支持机内分析和/或热成像的摄像机。用户可以在VMS平台或智能摄像机的规则引擎内配置事件。这些事件可以是物体距离触发器(即检测物体之间的距离小于1.5米)、物体计数触发器(即检测某个地点内一定数量的访客)或温度触发器(即检测温度高于38摄氏度的物体)。

这些事件中的任何一个都可以触发对Userful API的HTTP调用,使Userful服务器能够自动改变视频墙、单个显示器或一组显示器上的内容。部署起来有多简单?它只需要三个步骤。

  1. 在摄像机内置分析引擎或基于软件的VMS平台上配置事件。
  2. 配置一个HTTP监听器;监测来自外部传感器的传入的HTTP呼叫。
  3. 配置一个信号源切换器;这是一套针对Userful API的软件指令,关于根据外部触发器在不同屏幕上显示什么内容。这可以是文字警告、指导视频、实时摄像机画面、Powerpoint幻灯片或客户决定显示的任何其他类型的内容。

最终结果(使用Python)在主程序中包含26行代码。 


如果 __name__ == '__main__':

    # 将套接字绑定到端口上        
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_address = ('192.168.1.100', 8081)
    print ('starting up on %s port %s' % server_address)
    sock.bind(server_address)
    
    # 听取传入的连接
    sock.listen(1)    
    while True:
        # 等待来自外部传感器的连接
        print ('waiting for a connection')
        connection, client_address = sock.accept()
        尝试一下。
            print ('connecting from', client_address)
            # 接收小块的数据并读取它
            while True:
                data = connection.recv(512)
                if data: 
                    # 提取来自Camera HTTP调用的数据。 
                    camera = extract(data)
                    # 登录到Userful服务器以获取认证cookie                   
                    session_header = login()
                    # 确定当前显示器上正在播放的内容
                    current_source = is_playing(session_header, 'Shop-Floor')
                    # 将显示器上的内容切换到一个预设的源(在 
                    # 本例是一个HTML警告信息
                    switch_source(session_header,'shop-Floor','HTML Warning')
                    # 等待5秒 
                    time.sleep(5)
                    # 切换回最初播放的内容
                    switch_source(session_header, 'Shop-Floor', current_source)
                    #delete_source(session_header,'PIP_Dynamic')    
                    time.sleep(5) 
                    休息
                否则。
                    print (sys.stderr, 'no more data from', client_address)
                    休息      
        最后。
            # 清理连接
            connection.close()
 
 
X

因此,让我们一步一步地跑完这个项目。

第1步:配置凸轮上的事件时代或VMS

在这个例子中,我们使用了第三方VMS平台的集成分析引擎,该引擎接收并记录了多个摄像机的摄像资料。管理员可以在摄像机规则引擎内配置不同的事件......这可以是移动触发器或分析触发器,VMS软件据此分析传入的视频资料并检测每个摄像机的事件,例如。

  1. 一个人进入记录窗口的一个特定区域。
  2. 一个人从A->B穿过一条虚拟线路(访客计数器)。
  3. 一个人从B->A穿过一条虚拟线路(访客计数器)。
  4. 体温升高的人(>38度)

每个事件都有一个行动呼吁;例如,一个HTTP REQUEST到我们在192.168.1.100:8081的网络监听器,信息内容包括摄像机名称和事件资格。一个事件规则的例子显示在下面的图片中。

 

 

第2步:HTTP监听器

HTTP网络服务器是一个简单的进程,它在你的机器上运行,正好做两件事。

  1. 在一个特定的TCP套接字地址(IP地址和一个端口号)上监听传入的http请求。
  2. 处理这个请求,并在套接字地址上收到消息时采取行动。

In this example; our listener is listening to port 8081 on it's external Ethernet interface on IP address 192.168.1.100. If incoming connections are detected, the data received in the HTTP message is collected and processed under a <call to action> routine. This is the routine of instructing the Userful server what to do. Enter your text here ...


# 将套接字与端口绑定        
    输入socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_address = ('192.168.1.100', 8081)
    print ('starting up on %s port %s' % server_address)
    sock.bind(server_address) 
    # 听取传入的连接
    sock.listen(1)   
 
    while True:
        # 等待来自外部传感器的连接
        print ('waiting for a connection')
        connection, client_address = sock.accept()
        尝试一下。
            print ('connecting from', client_address)
            # 接收小块的数据并读取它
            while True:
                data = connection.recv(512)
                如果数据。 

                else:
                    print (sys.stderr, 'no more data from', client_address)
                    休息      
        最后。
            # 清理连接
            connection.close()
  
 
 
X

在我们在屏幕上切换信号源之前,我们会检查一个区域(即一组屏幕)中当前播放的是什么信号。这样,一旦有事件发生,我们就可以返回到原来的内容。下面的代码将检测当前正在播放的信号源的名称(即招牌播放器名称,或其他)。当调用这个函数时,我们将传递我们的认证cookie和区域名称。


  def is_playing (session_header, zone):
    get_url = api_url_base + '/api/zones/byname/' + zone
    response = requests.get(url=get_url, headers=session_header)
    如果 response.status_code == 200:
        data = response.content
        dict = json.load(data)
        sourceID = dict['playingSourceId'] 。 
        sourceName = get_source_info(session_header,sourceID)
        print(sourceName, 'is playing')
    否则。
        print (response.status_code)
    返回sourceName

def get_source_info (session_header, sourceID):
    get_url = api_url_base + '/api/sources/' + sourceID
    response = requests.get(url=get_url, headers=session_header)
    如果 response.status_code == 200:
        data = response.content
        dict = json.load(data)
    否则。
        print (response.status_code)
    返回dict['sourceName'] 

  
 
 
X

现在我们已经确定了当前播放的音源的名称,我们可以改变该区的音源。


  def switch_source(session_header, zone_name, source_name):
    post_url = api_url_base + '/api/zones/byname/' + zone_name + '/switch?destinationSourceName=' + source_name
    响应 = requests.put(url=post_url, headers=session_header)
    value = False
    如果 response.status_code == 200:
        data = response.content
        value = json.load(data)["isPlaying"] 。
        print('Source Switched')
    否则。
        print (response.status_code)
    返回值 

  

 

 
 
 
X

And that is it…. The <CALL TO ACTION> in our HTTP Listener becomes: (1) retrieve the AUTH cookie for the Userful Server, (2) Detect current source playing in a particular zone, (3) Switch the content on the displays to a 'HTML Warning' message stored on the local server (4) Pause for some time, (5) Switch back to the original source.


  # 登录到Userful服务器以获取认证cookie                   
                    session_header = login()
                    # 确定当前显示器上正在播放的内容
                    source = is_playing(session_header, 'Zone-3')
                    # 将显示器上的内容切换到一个预设的源(在这个例子中是一个HTML警告信息
                    switch_source(session_header,'Zone-3','HTML Warning')
                    # 等待5秒 
                    time.sleep(5)
                    # 切换回最初播放的内容
                    switch_source(session_header, 'Zone-3', source)
                    #delete_source(session_header,'PIP_Dynamic')    
                    time.sleep(5) 
                    休息 

  

我们可以通过实际查看从摄像机或VMS平台的HTTP调用中收到的数据来扩展这个脚本。这些数据可以包含关于摄像机和/或触发源的信息,这些信息可以用来显示不同类型的内容。想象一下摄像机的实时画面,或者--如果摄像机在计算人数--显示商店里有多少顾客,以及还有多少顾客可以进入商店。

通过REST-API的简单性,客户和系统集成商可以部署简单的解决方案来实现一些技术上令人惊叹的功能。不需要来自不同供应商的点解决方案。只要有一点想象力,结合有限的编码技能,就能让你走得更远。我希望我们触发了你的兴趣,并期待着参与进一步的思想和例子的交流。