Windows IoT Impressions

I am impressed with the ability to run Windows on the ARM and with how easy it is to use out of the box. But developing and deploying applications? Not such a pretty picture–Microsoft has a LONG way to go still. A RPi device with RaspianOS and python is a much better option at this point in time for my purposes: electronics interfacing and sensors. For reference, I have the following platform: Raspberry Pi 3 with Windows IoT 10.0.14376.0, and a Windows 10 desktop with Visual Studio 2015 Update 2.

The Pros

Being able to ssh into my device…excellent! Powershell is no replacement for Bash, but it is good enough and get the job done. Being able to mount my device’s C:\ and drag and drop files to the device…awesome! Networking functioning straight out of the box after plugging it into my Ethernet switch…check! Web-based control panel for monitoring the device, updating Windows, power-cycling…check! Headless capability…check!

The platform looks good overall, the only thing I am yearning for is Bash, but that is because I’m a Bash power user. For someone familiar with Powershell, I’m sure this is just perfect.

The Cons

My biggest disappointment is that Visual Studio remote debugging and remote deployment of apps does not appear to work. Based on my research, Microsoft removed the binary msvsmon.exe from their Windows IoT distribution, expecting it to be installed on a device by Visual Studio. That would make sense conceptually, but if Visual Studio cannot connect to the device, how do I get started?  I can ping the device, SSH into it, mount its c:\ on my desktop…so this is clearly not a connectivity issue. The issue must be with Visual Studio and Windows 10 IoT not playing nice together.

Capture1

Sorry, Microsoft. None of the settings in that menu are helping with this issue. Further research reveals that this was a problem with Windows IoT 10586 and Visual Studio 2015 Update 1.  Other workarounds provided, such as universal encryption disablement, do not appear to even be an option in VS 2015 Update 2.  Visual Studio has changed yet again from November 2015 when this problem first appeared, and so far I have been unable to figure out exactly what will fix the issue.

My guess is that a fix will be coming down the pipeline at some point, but frankly this platform is still to immature for serious development. I thought of downgrading to an older version of Windows IoT, but Microsoft is not allowing me to download it, I am only able to get the latest version (which I currently have). And after how long it took to get Visual Studio installed…and then updated…snowball’s chance in hell I’m going back to an older version of Visual Studio.

Closing Thoughts

For now I have to build a C++ application on my desktop and then copy the binary over to my Windows IoT device. That will work for now as I am still getting my feet wet, but hopefully that will be addressed in the next Windows IoT build, or next Visual Studio update. Once I start doing more complex things I will definitely want to be able to debug remotely.

I have started to browse some of the C++ samples and I am getting nervous, the code looks atrocious and appears to depend on some Windows RT libraries, COM objects, etc. Hopefully it will just be a small learning curve and be boiler plate code. I am sure it is easier with C#, but I don’t care to learn C# just for this device. Waste of my time. Perhaps if the C++ is too immature then there is hope for python? To be seen…

Trying out Windows IoT

To be brutally honest, Windows as a system is rather boring for a guy who is interested in embedded systems. Don’t take me for a zealot, though I prefer Linux for most things, Windows has its place for sure. Microsoft Excel is the killer application in my book, and there are great CAD tools like Altium and SolidWorks that make it an excellent platform for getting real work done. But for embedded systems??? Sure there was Windows CE, but that was really overkill. PalmOS was much more slick in its time! And iOS and Android are rightly putting Windows Phone in the grave. When I first read about Windows IoT, I did not bother to read any further. It sounded like another half-assed Microsoft attempt at trying to be relevant outside of desktop computing.

Yet I found I was reading an article about I2C/SPI interfaces and the Windows Driver Kit, and that sparked an interest. I can use Windows to control I2C, SPI, and GPIO devices? Please tell me more! Microsoft has created a stripped down version of Windows 10, known as Windows 10 IoT, that is capable of running on x86 and ARM processors. You can develop C++, C#, or Python apps with Microsoft Visual Studio, and then remotely debug and deploy apps to an embedded host. Now that sounded interesting! And there is more! You can download the community edition of Visual Studio for free and obtain Windows 10 IoT for free as well (permitted if you have Windows 10 Desktop). Sign me up.

So I ordered a Raspberry Pi 3 (64-bit ARM) that supposedly came with an SD card loaded with NOOBS directly from the Microsoft Store. I opened the box, pulled the microSD card out of the SD card holder, plugged it into the Pi unit, and then powered it all up. According to Microsoft, I would have the option to install Windows IoT once I booted the device via NOOBS. Imagine my surprise when I boosted the system and I found I was in Raspian! So it looks like NOOBS was *NOT* on the SD card! Annoying…

I downloaded NOOBS from the Raspberry Pi website and reformatted the SD card and decided to try again. This time the NOOBS system came up asking which system to install. I selected Windows IoT, and a browser eventually opened up asking me to login with a Microsoft account. It turns out I could not proceed since my outlook.com user account was not in the Windows Insider program. I returned to my desktop computer and registered my outlook.com account in the program–luckily it is free, unlike MSDN! I was now greeted as an Insider by Microsoft Insider’s website.

Unfortunately things got worse:

  • I returned to NOOBS, tried to login on the Pi, but Microsoft informed me I was not an Insider
  • I confirmed on my desktop that my outlook.com account is indeed part of the Insider program
  • A few more times and I gave up for the night, tired of the circular process and run-around
  • 24 hours later, on the Pi, Microsoft was still telling me I was not an Insider…yet in my Outlook.com inbox I had a welcome message to the program…
  • On my desktop, I managed to get through, and downloaded the Windows IoT ISO image; I got busy so that was it for the day…annoying
  • 48 hours later, on the Pi, Microsoft was still telling me I was not an Insider

I gave up and decided to just do a manual install. Luckily that was not so bad: download the ISO, install it on your Desktop (which extracts a disk image), and install the Windows IoT Core tool and manually flash the image to the SD card.

After that things went smoothly, the Raspberry Pi booted in Windows and grabbed an IP address off of my network switch (as it should) via DHCP with no hitches. I was even able to SSH into the device via my Linux computer. It was a pain in the ass to get this far, but it all looks interesting and I am willing to let bygones be bygones. Hopefully the hard part is over, and it will be a breeze with Visual Studio and loading software onto the Raspberry Pi.

I have to say Microsoft has a lot of work ahead of it. Instead of wasting everyone’s time with their stupid developer’s program accounts and registrations, it would be great if they just put the ISO out there for their target platforms and require tools–we want to get to work, not wait 24 hours for account registrations to be propagated within Microsoft. Also:

  1. Don’t market and sell Raspberry Pi 3’s without clearly stating you don’t yet support it!
  2. Fix the stupid Windows Insider program mess…it was ridiculous…and there was no email to send a help request to either…the guidance was to ask the community for help!
  3. Go for more spartan websites, it is tiring clicking through all of the links

More to come on Windows IoT soon I hope…from the C++ application side and Windows driver side of course!

Homebrew Router at Arstechnica

As a follow-on to the earlier article I linked to comparing homebrew versus consumer routers, ArsTechnica has published an article with instructions on building a homebrew router.

I must admit I am very interested in such a project. I am looking at upgrading the home network, which includes obtaining more bandwidth from Verizon. I would like to have my Optical Network Terminal (ONT) switched from coaxial output to the Ethernet output. With such a configuration, I could install my own router rather than depending on the router+wifi combo that Verizon provided. Why? Just so I can have more control over my network, and I won’t have Verizon always telling me that I have too many devices and need to buy even more bandwidth. I don’t like how they can inspect all of the devices in my home network.

I am trying to decide the route to go, however. Part of me says I just need to find a consumer router and throw OpenWRT on that. I am tempted, but it can be hassle to buy a router with 802.11 AC that will work 100% guaranteed. The other option I am considering is getting a plan old router with no wireless, such as a Mikrotek, and use it out of the box. Or maybe even a plain old router with just OpenWRT? Then I could get a wireless access point and have it hook up directly to the dedicated Ethernet switch I acquired. I like the idea of having multiple devices, each handling a specific job. The downside though is that if something goes down while I’m at work or traveling for work, then I’d have to walk my wife through the troubleshooting rather than having her go flip a switch on the Verizon router.

Decisions…decisions…

GNU C++ and Gold Linker

The Gold linker (ld.gold) is a ELF linker developed at Google and added to the binutils toolset that can be used in place of standard linker (ld) from binutils.  The Gold linker offers faster object linking times for C++ programs, which is particularly attractive to large C++ code bases. Please follow this link (Linux Foundation) for an interesting read on how it works.

Most Linux platforms will default to using the standard linker, so below are a few options for overriding and using the ld.gold linker:

  1.  Use the -fuse flag on gcc/g++:  g++ -fuse-ld=gold test.cpp
  2. Setting “export LD=ld.gold” so that the $LD environment variable uses ld.gold rather than ld (this is useful for projects using makefiles)
  3. As the supper user, running binutils-config –linker ld.gold to change the default

Home network upgrade: Storage Acquisition

For as long as I can remember I have been dealing with storing files in the following manner: floppy disks, zip drive disks, and now USB hard drives. When I had a Mac computer I actually was very good about regularly backing up my files via ChronoSync and then finally Time Machine. For the past three years I have been without a Mac and just have an old Laptop with Linux and an old desktop with Windows. For these machines, I have been backing up simply by copying files to a USB hard drive. My wife has been using the USB hard drive as well with her Windows laptop  However, over the years we have compiled and saved a lot of photos and videos. The USB hard drives are difficult to organize and manage well among the two of us, and a large volume USB drive is still quite pricey, so we entered the market for a networked storage system where we can save and share files from a central location.

I ruled out Dropbox, Google Drive, and other cloud based solutions as primary storage source. Why? Because I frankly haven’t bought into the cloud yet. For sharing files with people at large, sharing code for school projects, etc., I find such services great. I utilize my Google Drive extensively for school work. However, I’m not quite ready to put tax returns, photos and private data on the cloud yet. For off-site back-up, it is on my to-do list for research and evaluation, but I prefer to keep my primary back-up in my control for the time being. Perhaps when I get a better grip on encryption…

The initial thought was to go for a step-up from a USB hard drive like my Western Digital My Passport and use a Personal Cloud device. Seems simple enough, right? Network connectivity? Check. File sharing? Check. However, last summer at the lab at work a manager came to me with a problem: three HDDs failed in the RAID5 solution purchased from Dell almost a decade ago. I found myself reading more about network storage solutions, which also got me thinking about my home situation. While a personal cloud solves the immediate problem of having a network-based storage, what if it fails? I need RAID!

I then went crazy and dived into the deep end, looking at a FreeNAS build with RAID Z3, SSDs, SAS disks, Xeon CPUs, 64 GB of memory…it started to get expensive quickly, and then I started thinking about the noise of server fans…stop!  I looked at scalding down to RAID Z1, and even just RAID1, but I would still need to build a PC and deal with the configuration and performance tuning. I decided that since I am working full-time, going to graduate school at night, and raising two small kids, that I probably should settle for a canned solution such as a storage appliance rather than something I would need to tune and pay close attention to. When I done with school and have more free time, I still like the idea of building my own FreeNAS system–what a project!

I started looking at Western Digital, Buffalo, Seagate, Drobo, Synology, QNAS, and many others. I narrowed down the decision to the QNAP TS-251 or Synology DS216+ based on reading many reviews, web forum posts, etc. Both units are priced competitively, and in the end I selected the Synology DS216+. With roughly the same technica specifications, it came down to look to the unit and the OS on the device. I would have went with the QNAP if we were to use the NAS for streaming video (the HDMI output is nice), but in reality this storage solution will be used solely for file storage.

I consider this an entry-level purchase since it is a two-drive bay enclosure, and I will configure it for RAID1 with two 3TB Western Digital Red NAS disks. The hope is that it will last me approximately five years, with the plan to upgrade the capacity in three years when the cost of larger hard disks has come down. The DS216+ is powered by a dual-core Intel Celeron rather than a Marvell or ARM solution, so hopefully that will help it keep up with our storage demands. After five years I will take a look at our storage need and consider a higher capacity solution such as 4-drive bay enclosures.

Now that we have a storage solution, I need to figure out the home network connectivity once and for all. We currently access and connect to everything through the Verizon FIOS provided wireless router/AP combo…

A year of math

I wrapped up my year-long course sequence in communications system theory at NCSU. Previously all of my graduate level courses have been in circuit design, and while there has been some math, it was all very manageable. This year, however, in order to build a solid foundation for my studies in RF and wireless communications, I decided to take communications system theory, and its prerequisite, random variables and random processes. What a year it has been!

The Pros:

I definitely feel like I have a solid grasp of the fundamentals of communications systems, and I hope it will serve me well in future courses. I think I am in a good place for course in the fall on the topic of wireless communications systems, and I think I will be ready for advanced subjects like MIMO signal processing. I have no doubt the random variables and processes background will help with any technical subject where one must model randomness, and I have even been able to apply some of it to some projects at work. I also picked up some much needed Matlab skills this year too, and I feel very comfortable with Matlab simulation and analysis.

The Cons:

In the 10+ years since I finished my undergraduate degree, I had not realized how many math skills I had lost. The course material all made sense this year, but the homework problems were intense and painful at times. I am sure that if I was fresh off of a three-sequence course in Calculus and a linear algebra course that I would have been in better shape. In addition to a table of derivatives/integrals, a table of trigonometric identities, and a table of Euler’s identities ought to be in any electrical engineering graduate student’s immediate reach. On the modeling side, I did not gain any skills with Simulink, which is unfortunate as I had hoped we could have utilized it as a learning tool in the communications theory class. I suppose it will be something that I will need to pick up on my own, perhaps over the summer.

Summary:

It has been a rough academic year, but probably a necessary year, and I hope that I will be better prepared for future graduate work. This summer I need to make some decisions about the future (Ph.D. studies?)…

Homebrew versus Consumer Routers

Arstechnica has an interesting article on typical consumer home routers versus a pfsense configuration running on a mini-computer. The article is very interesting to me as I have been thinking about doing something similar such as having a router/firewall on wired device and setting up separate access points with different hardware. The comments are also very interesting, making mention of SOHO networking equipment from Ubiquiti Networks or MikroTik. I love the idea of putting up Ubiquiti UniFi APs on each floor of my house, and having them feed into a router with PoE. However, I would need to figure out how to run Ethernet cable up three floors in this townhouse. I suppose I could try to run it up behind the drywall in the staircase, and install one AP between the first and second floor, and the other AP in the basement. However, I don’t know that there would be an easy way to run the Ethernet cable. I would probably have to drill through some 2x4s. It would be a fun and interesting project too…one to put on the TODO list I guess!