×

基于Azure Sphere的安全防盗设备

消耗积分:0 | 格式:zip | 大小:1.21 MB | 2022-12-09

王兰

分享资料个

描述

一、概念

贵重物品,如博物馆中的艺术品或公共场所的各种设备,需要防止被盗。传统上,这是由专门的安全人员完成的。

在这个项目中,我将展示一个连接互联网的防盗设备,它可以用作安全人员的替代品或补充品。

该设备就像一个支架,但顶板安装在称重传感器上。这样就可以高精度地监控放置在支架上的重量,并且可以快速检测到任何变化。概念:放置在设备上的贵重物品

 

除了重量传感器外,加速度计和光学传感器等辅助传感器还可用于检测振动或其他可疑活动。

我构建的概念验证设备基于Avnet 的 Azure Sphere MT3620 入门套件,并使用 3 Kg 称重传感器作为其主要传感器,以及 Sphere 套件的内置加速度计:

poYBAGOSoVKAWigQAAmS_jsMYyM534.jpg
概念验证设备
 

该设备已连接互联网,可以通过 Azure Central IoT 应用程序轻松远程监控。使用自动规则检测盗窃并采取行动。

poYBAGOSoVyAR-HqAASY9TxVq6I361.png
测试设置
 

Azure Sphere 平台提供的创新安全基础架构使设备软件无法被篡改。

2. 蔚蓝领域

Azure Sphere 是 Microsoft 用于物联网解决方案的安全高级应用程序平台。

它由 3 个主要部分组成:

  • 安全的 Azure Sphere MCU 微控制器单元 (MCU) - 目前支持 MediaTek MT3620
  • Azure Sphere OS,一个由微软维护的基于 Linux 的操作系统
  • 基于云的 Azure Sphere 安全服务 (AS3)

目前我们可以使用 3 个官方开发工具包来试验 Azure Sphere 平台:

pYYBAGOSoV6AFAgEAABpSMmXb6s351.png
 

所有这些都基于联发科与微软合作设计的联发科 MT3620 MCU。

MCU具有以下主要特点:

  • 1 x ARM Cortex A7 内核,用于高级应用
  • 2 x ARM Cortex M4 内核用于实时控制
  • 双频 Wifi 子系统,2.4 + 5 GHz,支持
  • I/O: 76 x GPIO, 12 x PWM, 5 x I2C / SPI / UART, 8 x 12-bit ADC等

标准 MCU 的东西。到目前为止没有什么有趣的.. :)

让 MT3260 有趣的是内置的 Microsoft Pluton 安全子系统,它具有以下特点:

  • 专用的 M4F 处理器
  • 真正的随机数生成器
  • 用于不同加密任务的加速器(SHA、AES、EEC)
  • 制造过程中芯片内生成的两个 EEC 私钥/公钥对
poYBAGOSoWCAFMayAABF_646k9o319.png
 

Pluton 还实现了一个带有远程认证的安全启动系统。这意味着已使用 Azure Sphere 安全服务 (AS3) 验证加载的启动映像(OS + 应用程序)的真实性。如果加载的图像有效/最新,AS3 会为设备颁发短期客户端证书(~1 天有效期),然后可用于连接到其他在线服务。如果加载的图像无效/最新,则不会颁发客户端证书,从而强制设备进行更新。

在这个项目中,我们将使用 Avnet MT3620 入门套件,这是一个基于 Azure Sphere 模块 AES-MS-MT3620-MG 的开发套件

poYBAGOSoWuACR52AANF1zxVUJM132.png
 

3. 开始

要开始使用 Avnet Azure Sphere MT3620 入门套件,我们需要考虑以下几点:

  • 运行 Windows 10 (周年更新或更高版本)的 PC
  • Visual Studio 2017 (社区版作品)

> Sphere SDK 安装

现在我们需要下载并安装Azure Sphere SDK for Visual Studio Preview软件:

pYYBAGOSoW2AVAZ1AAA-rp-_lL4801.png
 

这将安装与 Azure Sphere 模块通信所需的驱动程序和工具。

> 领取设备

在此之后,我们可以按照Azure Sphere 文档入门页面中的步骤进行操作。

要使用 Azure Sphere,我们需要一个 Azure Active Directory 工作/学校帐户。这可以从Azure 门户Azure Active Directory / 用户部分创建。新创建的帐户应该类似于:

pYYBAGOSoXaAINsrAACmfbMBSso298.png
活动目录帐户
 

下一步是领取您的设备这会将您的设备永久链接到我们之前创建的帐户 (!),从而将设备的访问权限锁定给您的租户。要声明设备,应从 Azure Sphere 开发人员命令提示符执行以下命令

### Sign in to Azure Sphere with previously created account
$ azsphere login

### Create a new Azure Sphere tenant
$ azsphere tenant create --name sphere

### Claim you device
$ azsphere device claim
poYBAGOSoXmADE5BAAEc7Dd7Tt8947.png
设备声明
 

> Wifi 和更新

现在我们可以配置Sphere 模块使用的 Wifi 网络。从 Azure Sphere 开发人员命令提示执行以下命令:

### Add a new Wifi network
$ azsphere device wifi add --ssid  --key 

### Check that the Sphere module is connected to the Wifi network
$ azsphere device wifi show-status
poYBAGOSoX2AMDByAADgm2n_nGc098.png
无线上网
 

我们能做的最后一件事是更新设备的 Azure Sphere 操作系统:

### Check if any update are available:
$ azsphere device show-ota-status

### Download and install the update:
$ azsphere device recover
pYYBAGOSoYOAHpX7AAFUr_7Zrnw462.png
操作系统更新
 

4.例子

在此之后我们可以尝试构建并运行 Blink 应用程序

  • 为了能够从 Visual Studio 等 IDE 运行/调试应用程序,我们需要在 Azure Sphere 设备中启用调试。这是通过从 Azure Sphere 开发人员命令提示符执行以下命令来完成的:
### Enable debugging
$ azsphere device prep-debug
pYYBAGOSoYyAYY8WAAE2u63BeYM243.png
启用调试
 
  • 我们还可以为 RT Core 应用程序启用调试:
### Enable debugging
$ azsphere device prep-debug --enablertcoredebugging
poYBAGOSoY-APohgAAFFhhA2Za4465.png
启用调试,实时内核
 

> 宾基

然后,我们可以从Visual Studio使用Azure Sphere Blink模板创建新项目:

poYBAGOSoZKACwDAAAHK709ZApY827.png
 

如果我们使用远程 GDB 调试器运行项目,Azure Sphere 初学者工具包的用户 LED 应该开始闪烁。

> 板载传感器,OLED 显示屏

接下来我们可以按照 Avnet 员工创建的两个 Azure Sphere Started-Kit 教程进行操作:

第一个教程介绍了 Azure Sphere 初学者工具包参考设计。第 1 部分涵盖以下功能:

  • 读取板载传感器,并在 Visual Studio 的调试控制台中打印读数(第 1 部分)

本教程的 GitHub 存储库是:Avnet/AvnetAzureSphereStarterKitReferenceDesign

第二个教程部分基于第一个教程,添加了以下额外功能:

  • 显示多个信息 128x64 像素 OLED 显示屏
  • 添加 Cortex-M4(实时)应用程序
  • 控制 MiroE Relay Click 板
  • 向 IoT Central 应用程序添加更多功能

第二个教程的 GitHub 存储库是:CloudConnectKits/Azure_Sphere_SK_ADC_RTApp

poYBAGOSobCAVHF2AAncksySxaU145.png
工作演示应用程序
 

我们可以从这些教程中学到很多东西,而且由于它们是 MIT 许可的,我们可以使用它们的代码库作为新项目的起点。

实时和高级应用程序

正如我之前提到的,MT3620 SoC 包括:

  • 一个 ARM Cortex-A7 内核——它运行基于 Linux 的 Sphere OS,也可以运行高级应用程序,
  • 两个 ARM Cortex-M4F 内核 - 这些可用于执行具有实时要求的任务
  • 核心可以相互通信

高级教程的代码存储库包括两个 Visual Studio 项目:一个用于 A7 应用程序核心,一个用于 M4F 实时核心。它还显示了两个内核如何进行通信。

> 云连接

本教程的第 2 部分和第 3 部分涵盖以下功能:

  • 配置 IoT 中心,上传传感器数据,操作设备孪生,在时序洞察中可视化数据(第 2 部分)
  • 使用自定义可视化和控制配置 IoT Central 应用程序(第3 部分)

物联网中心

IoT 中心是 Azure 云中可用的 IoT 解决方案之一。

要将教程应用程序与 IoT 中心一起使用,第一步是从 Azure 门户创建一个 IoT 中心:

pYYBAGOSobWAZenOAAC5QqWSnbk296.png
球体物联网中心
 

然后我们需要添加一个新设备:

pYYBAGOSobmAQulzAACuN6AdbLU833.png
球体物联网设备
 

并从其配置中复制主连接字符串:

poYBAGOSobyAIOBZAACyGpF5vVI923.png
 

连接字符串需要放在connection_strings.h.

现在,如果我们以 IoT 中心应用程序模式运行应用程序:

// If your application is going to connect straight to a IoT Hub, then enable this define.
#define IOT_HUB_APPLICATION

我们应该能够看到 Device Twin 更新了我们的传感器数据

poYBAGOSocCABl9MAADqbSNbs4k162.png
设备孪生
 

物联网中心

另一种选择是在 IoT Central 应用程序模式下运行

// If your application is going to connect to an IoT Central Application, then enable this define.  When
// enabled Device Twin JSON updates will conform to what IoT Central expects to confirm Device Twin settings
#define IOT_CENTRAL_APPLICATION

IoT Central 是 Azure 云中可用的另一种物联网解决方案,它可以轻松创建基于物联网的云应用程序,而无需编写太多代码。

稍后我将在 Azure IoT Central 应用程序部分解释如何执行此操作。

5. 硬件

该设备由以下电子元件构成:

  • Azure Sphere MT3620 入门套件
  • 连接到 HX711 24 位 ADC 的 3 Kg 称重传感器
  • 用于 HX711 的 DIY Click 适配器

硬件部分在FreeCAD中建模,由以下部分组成:

  • 用一块废低密度纤维板制成的底座
  • 将称重传感器连接到底座的 3D 打印部件
  • 安装在称重传感器上的 3D 打印部件。这同时支持顶级 plthe Sphere 入门套件
  • 由 2mm 丙烯酸玻璃制成的顶板
  • 2 x M5 和 2 x M4 螺丝
poYBAGOSocKAfSHuAAAneoI7F8A306.png
 

由于一切都在 3D 中建模,因此组装非常容易:

 
 
 
poYBAGOSoe-AJROVAA5-80B4lX8767.jpg
 
1 / 4第 1 步:用两个 M5 螺钉将称重传感器安装到底座上
 

6.软件

作为在 Azure Sphere Kit 上运行的软件的基础,我使用了 Avnet Azure Sphere Starter-Kit 的代码库: Peter Fenn高级教程

Azure Sphere Kit 运行的软件分为两部分:

  • 在 A7 应用处理器上运行的高级应用程序
  • 在其中一个 M4 处理器上运行的实时应用程序

两个内核上的应用程序使用内核间通信进行连接。

pYYBAGOSofSAe1_VAAArqOhDBxc409.png
M4和A7内核+它们之间的内核间通信
 

主要思想是将时间敏感任务(如传感器处理)运行在 M4 实时内核上。然后,负责云连接等任务的高级应用程序可以在 A7 应用程序处理器上运行。

> A7 高级应用

在 A7 应用处理器上运行的高级应用程序负责:

  • 读取 HX711+ 称重传感器
  • 从加速度计读取值
  • 处理OLED显示器
  • 处理按钮/ LED
  • 与 Azure IoT Central 的云通信
  • 与 M4 内核的内核间通信

负责将数据发送到 Azure IoT Central 的代码部分以及在 OLED 屏幕上显示数据的代码部分已更新为包含来自新添加的 HX711 称重传感器数据的数据。

> HX711驱动

该项目使用 HX711 芯片,一个 24 位 ADC 来测量负载传感器传感器产生的小电压。

由于没有现成的支持 MT3260 的 C 驱动程序,我决定移植现有的 Arduino HX711 库:https ://github.com/bogde/HX711

将库从 Arduino 迁移到与 MT3620 一起使用的步骤是:

  • 将代码从 C++ 迁移到 C
  • 迁移了 GPIO 部分以使用 MT3620 GPIO 库

> M4 实时应用

结果证明 HX711 对时序有点敏感。在使用 A7 高级代码之前,我遇到了一些麻烦。HX711 的时钟需要外部提供,A7 上的 GPIO 操作有点慢(3-7 us)。由于一些不必要的代码,时钟周期超过 60us,HX711 进入睡眠模式。

出于这个原因,我决定尝试将 HX711 驱动程序代码卸载到 MT3260 的具有 M4 实时功能的内核之一。然后使用 MT3260 MCU 的 A7 和 M4 内核之间的内核间通信传输传感器数据。

注意:实时应用程序部分的代码已经完成,但我还没有成功测试它。我 PC 上的 Azure Sphere SDK 损坏了,但还没有设法修复它。

7. Azure 物联网中央应用

该项目的 UI 是使用 Azure IoT Central 完成的。

要开始使用 Azure IoT Cental,我们首先需要转到apps.azureiotcentral.com并创建一个新应用程序。

> 设备模板

首先要做的是定义我们从设备发送的字段的测量值。

这些是:

  • 称重传感器测量的重量
  • X、Y、Z加速度(G力)
  • X、Y、Z角速率
poYBAGOSofiAdH5zAACZ_Fdlkhw615.png
设备模板,测量
 

> 创建设备

接下来我们可以添加我们的设备:

poYBAGOSofyARCB-AAA9eT21H28404.png
创建设备
 

并为其创建连接

pYYBAGOSogGATD2EAACaJmEDqLs824.png
设备连接
 

有了这个,我们可以使用实用程序生成连接字符串:dps-keygen

$ dps-keygen -si: -di: -dk:

Azure IoT DPS Symetric Key Generator v0.3.3
Connection String:

HostName=iotc-2e2dxxxx-xxxx-xxxx-xxxxxxxxxxxxxxx.azure-devices.net;DeviceId=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;SharedAccessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=

生成的连接字符串需要放在connection_strings.h文件中。

> 三围

在此之后,设备应该能够将数据发送到 Azure 云,我们应该能够将其可视化:

poYBAGOSogeAWbQLAADANtOUmm4337.png
传感器数据
 

> 仪表板

我们还可以配置仪表板,如下图所示

poYBAGOSogyATX7BAAEDPPh9kdw869.png
 

> 规则与通知

Azure IoT Central 还允许定义不同的规则并为其分配操作。

例如,我们可以创建规则来检测以下内容:

  • 称重传感器测量的重量下降(有人拿走了我们的贵重物品)
  • 振动比平时高

贝娄是一个规则的例子,如果振动达到两个高度,就会发送一封电子邮件:

pYYBAGOSohCAd6T9AADOoMocv_o476.png
 
pYYBAGOSoheAAaknAAE_2wUyxS4323.png
 
poYBAGOSohqAOuJmAACYl7zFi0w280.png
 

注意:通常我会将其配置为基于权重的规则,但此时 HX711 驱动程序代码尚未完全发挥作用。不幸的是,今天(11 月 30 日)我 PC 上的 Azure Sphere SDK 不知何故损坏了,而且还没有设法修复它。由于这个原因,上面的和其他一些截图可能已经过时了

8. 未来的工作

这个项目有很多想法/领域可以改进。我计划做的一些是:

  • 将 MEMS 和其他传感器的处理迁移到 ARM M4 实时内核
  • 实施基于实时中断的振动检测
  • 尝试自动设备配置

另一个有趣的主题是深入研究 Azure Sphere 平台提供的安全基础设施,并了解每个组件的工作原理。

9.资源

项目的源代码、3D 模型/CAD 文件和其他资源可以在链接的 GitHub 存储库中找到。

查看我提交给Element14 上的感知世界挑战赛:基于 Azure Sphere 的安全物联网空气质量传感站

以下是有关 Azure Sphere 的一些有用文章:

题外话:自动每日注册

pYYBAGOSoiWAWzHhAAHjJ4uEn-g915.png
最后一天(11 月 30 日)截图
 

竞赛要求之一是在Avnet 竞赛应用程序中连续30 (或 15)天注册我们的 Azure Sphere 套件

现在,这个连续 30 天的要求可能有点棘手。特别是夏天,如果你要去度假并且不想带笔记本电脑,或者你只是要去一个没有互联网的偏远地方。

我对这个问题的解决方案是使用Macro Toolworks Windows Task Scheduler和一些 shell 脚本来自动化该过程。它的工作原理如下:

  • 我手动打开入门工具包注册应用程序并完成所有输入字段
  • Azure Sphere Started Kit 连接到 USB 端口
  • 使用 Windows Task Scheduler,任务被安排为每天运行两次。该任务唤醒 PC 并执行一组操作:
 
 
 
pYYBAGOSoimAAJibAABK1mftck0549.png
 
1 / 3
 
  • Azure Sphere 服务重新启动,因为它有时会在计算机从睡眠中唤醒后变得无响应
  • 一个 Macro Toolworks 脚本在运行。该脚本模拟鼠标移动和点击。它执行以下操作:
poYBAGOSoiyAGMvqAAEPCWLYiRw685.png
 
  • 单击读取设备按钮,因此应用程序将连接 Azure Sphere 模块并读取其状态
  • 等待一段时间后,单击“发送到服务器”按钮。将出现确认对话框
  • 执行截屏的 shell 脚本。屏幕截图保存在自动同步到 Google 云端硬盘的文件夹中
pYYBAGOSoi6AenbLAAB3jWvPW-E209.png
初学者工具包注册 + 用于自动化的脚本
 
  • 按下确定按钮
  • 此后,Macro Toolsworks 脚本存在,计算机再次进入睡眠状态

这个过程连续运行了大约 42 天,直到 9 月 14 日,我认为比赛注册服务器出现了一些问题,应用程序被卡住了。我当时决定停止这个过程。

然而,Azure Sphere Started Kit 通过 USB 供电超过 2 个月,仍然可以正常工作。

享受 !:)


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'基于Azure Sphere的安全防盗设备',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);